Помогите с кодом на Arduino mega 2560
- Войдите на сайт для отправки комментариев
Помогите с кодом на Arduino mega 2560
Хотельсь бы реализовать управление роботом по Wi FI.
Управление едет через роутер WR702N, теперь надо разобратся с дуиной.
Прошу вашей помощи......
Есьть код под Arduino Mini Pro :
int led = 13;
boolean laight = 0;
int incomingByte = 0;
int action = 0;
void setup() {
Serial.begin(115200);
pinMode(13, OUTPUT);
pinMode(4, OUTPUT); //light
pinMode(5, OUTPUT); // шим 1
pinMode(6, OUTPUT); // шим 2
pinMode(7, OUTPUT); // 11
pinMode(8, OUTPUT); // 12
pinMode(11, OUTPUT); // 21
pinMode(12, OUTPUT); // 22
}
void loop() {
//Serial.print("1");
if (Serial.available() > 0) { //если есть доступные данные// считываем байт
incomingByte = Serial.read();
// отсылаем то, что получили
digitalWrite(13, HIGH);
if(incomingByte == 97) // A
action = 7;
if(incomingByte == 100) // D
action = 8;
if(incomingByte == 115) // S
action = 11;
if(incomingByte == 119) // W
action = 12;
if(incomingByte == 108) // L
laight=!laight;
digitalWrite(4, laight);
//analogWrite(8, 255);
//analogWrite(9, 255);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(action, HIGH);
delay(250);
digitalWrite(action, LOW);
action = 0;
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(13, LOW);
Serial.print("250: ");
Serial.println(incomingByte, DEC);
}
}
Подключаю дуину к L298N.
Зашивал етот код в Arduino mega 2560, - шим работает а 7. 8. 11. 12. нет. помогите.
и еще хотелось бы добавить управление серво - камерой и прочие.
Прошу вашей помощи...
а что такое 7.8.11.12 ?
а что такое 7.8.11.12 ?
Выводы на дуине... Arduino mega 2560
pinMode(7, OUTPUT); // 11
pinMode(8, OUTPUT); // 12
pinMode(11, OUTPUT); // 21
pinMode(12, OUTPUT); // 22
а что такое 7.8.11.12 ?
Выводы на дуине...
да это-то очевидно.....
я наверно слишком тонко намекал про отсутствие телепатических способностей, и намеки остались непонятны. к черту экивоки, спрашиваю в лоб : что подключено к этим ногам и почему вы решили, что "оно не работает"? digitalWrite(action, HIGH), контроллер должен подать на вывод 5 вольт. он это делает? если да, то какие к нему претензии? если нет, то значит брак, меняйте контроллер или пробуйте на других выводах
вы код сами писали?
это не то, что вы написали
это не шим
Вот тут нашол проект, есть код но надо переделать под мой. WI FI
а что такое 7.8.11.12 ?
Выводы на дуине...
да это-то очевидно.....
я наверно слишком тонко намекал про отсутствие телепатических способностей, и намеки остались непонятны. к черту экивоки, спрашиваю в лоб : что подключено к этим ногам и почему вы решили, что "оно не работает"? digitalWrite(action, HIGH), контроллер должен подать на вывод 5 вольт. он это делает? если да, то какие к нему претензии? если нет, то значит брак, меняйте контроллер или пробуйте на других выводах
вы код сами писали?
это не то, что вы написали
это не шим
Код писал не я...
Вот тут нашол проект, есть код но надо переделать под мой. WI FI
http://cxem.net/uprav/uprav46.php
#include "EEPROM.h"
#define D1 2 // направление вращение двигателя 1
#define M1 3 // ШИМ вывод для управления двигателем 1 (левый)
#define D2 4 // направление вращение двигателя 2
#define M2 5 // направление вращение двигателя 2 (правый)
#define HORN 13 // доп. канал 1 подключен к 13 пину
//#define autoOFF 2500 // кол-во миллисекунд через которое робот останавливается при потери связи
#define cmdL 'L' // команда UART для левого двигателя
#define cmdR 'R' // команда UART для правого двигателя
#define cmdH 'H' // команда UART для доп. канала 1 (к примеру сигнал Horn)
#define cmdF 'F' // команда UART для работы с EEPROM памятью МК для хранения настроек
#define cmdr 'r' // команда UART для работы с EEPROM памятью МК для хранения настроек (чтение)
#define cmdw 'w' // команда UART для работы с EEPROM памятью МК для хранения настроек (запись)
char
incomingByte;
// входящие данные
char
L_Data[4];
// строковый массив для данных левого мотора L
byte
L_index = 0;
// индекс массива
char
R_Data[4];
// строковый массив для данных правого мотора R
byte
R_index = 0;
// индекс массива
char
H_Data[1];
// строковый массив для доп. канала
byte
H_index = 0;
// индекс массива H
char
F_Data[8];
// строковый массив данных для работы с EEPROM
byte
F_index = 0;
// индекс массива F
char
command;
// команда: передача координат R, L или конец строки
unsigned
long
currentTime, lastTimeCommand, autoOFF;
void
setup
() {
Serial.begin(9600);
// инициализация порта
pinMode
(HORN,
OUTPUT
);
// дополнительный канал
pinMode
(D1,
OUTPUT
);
// выход для задания направления вращения двигателя
pinMode
(D2,
OUTPUT
);
// выход для задания направления вращения двигателя
/*EEPROM.write(0,255);
EEPROM.write(1,255);
EEPROM.write(2,255);
EEPROM.write(3,255);*/
timer_init();
// инициализируем программный таймер
}
void
timer_init() {
uint8_t sw_autoOFF = EEPROM.read(0);
// считываем с EEPROM параметр "включена ли ф-ия остановки машинки при потере связи"
if
(sw_autoOFF ==
'1'
){
// если таймер останова включен
char
var_Data[3];
var_Data[0] = EEPROM.read(1);
var_Data[1] = EEPROM.read(2);
var_Data[2] = EEPROM.read(3);
autoOFF = atoi(var_Data)*100;
// переменная автовыкл. для хранения кол-ва мс
}
else
if
(sw_autoOFF ==
'0'
){
autoOFF = 999999;
}
else
if
(sw_autoOFF == 255){
autoOFF = 2500;
// если в EEPROM ничего не записано, то по умолчанию 2.5 сек
}
currentTime =
millis
();
// считываем время, прошедшее с момента запуска программы
}
void
loop
() {
if
(Serial.available() > 0) {
// если пришли UART данные
incomingByte = Serial.read();
// считываем байт
if
(incomingByte == cmdL) {
// если пришли данные для мотора L
command = cmdL;
// текущая команда
memset(L_Data,0,
sizeof
(L_Data));
// очистка массива
L_index = 0;
// сброс индекса массива
}
else
if
(incomingByte == cmdR) {
// если пришли данные для мотора R
command = cmdR;
memset(R_Data,0,
sizeof
(R_Data));
R_index = 0;
}
else
if
(incomingByte == cmdH) {
// если пришли данные для доп. канала 1
command = cmdH;
memset(H_Data,0,
sizeof
(H_Data));
H_index = 0;
}
else
if
(incomingByte == cmdF) {
// если пришли данные для работы с памятью
command = cmdF;
memset(F_Data,0,
sizeof
(F_Data));
F_index = 0;
}
else
if
(incomingByte ==
'\r'
) command =
'e'
;
// конец строки
else
if
(incomingByte ==
'\t'
) command =
't'
;
// конец строки для команд работы с памятью
if
(command == cmdL && incomingByte != cmdL){
L_Data[L_index] = incomingByte;
// сохраняем каждый принятый байт в массив
L_index++;
// увеличиваем текущий индекс массива
}
else
if
(command == cmdR && incomingByte != cmdR){
R_Data[R_index] = incomingByte;
R_index++;
}
else
if
(command == cmdH && incomingByte != cmdH){
H_Data[H_index] = incomingByte;
H_index++;
}
else
if
(command == cmdF && incomingByte != cmdF){
F_Data[F_index] = incomingByte;
F_index++;
}
else
if
(command ==
'e'
){
// если приняли конец строки
Control4WD(atoi(L_Data),atoi(R_Data),atoi(H_Data));
delay
(10);
}
else
if
(command ==
't'
){
// если приняли конец строки для работы с памятью
Flash_Op(F_Data[0],F_Data[1],F_Data[2],F_Data[3],F_Data[4]);
}
lastTimeCommand =
millis
();
// считываем текущее время, прошедшее с момента запуска программы
}
if
(
millis
() >= (lastTimeCommand + autoOFF)){
// сравниваем текущий таймер с переменной lastTimeCommand + autoOFF
Control4WD(0,0,0);
// останавливаем машинку
}
}
void
Control4WD(
int
mLeft,
int
mRight, uint8_t Horn){
bool directionL, directionR;
// направление вращение для L298N
byte
valueL, valueR;
// значение ШИМ M1, M2 (0-255)
if
(mLeft > 0){
valueL = mLeft;
directionL = 0;
}
else
if
(mLeft < 0){
valueL = 255 -
abs
(mLeft);
directionL = 1;
}
else
{
directionL = 0;
valueL = 0;
}
if
(mRight > 0){
valueR = mRight;
directionR = 0;
}
else
if
(mRight < 0){
valueR = 255 -
abs
(mRight);
directionR = 1;
}
else
{
directionR = 0;
valueR = 0;
}
analogWrite
(M1, valueL);
// задаем скорость вращения для L
analogWrite
(M2, valueR);
// задаем скорость вращения для R
digitalWrite
(D1, directionL);
// задаем направление вращения для L
digitalWrite
(D2, directionR);
// задаем направление вращения для R
digitalWrite
(HORN, Horn);
// дополнительный канал
}
void
Flash_Op(
char
FCMD, uint8_t z1, uint8_t z2, uint8_t z3, uint8_t z4){
if
(FCMD == cmdr){
// если команда чтения EEPROM данных
Serial.print(
"FData:"
);
// посылаем данные с EEPROM
Serial.write(EEPROM.read(0));
// считываем значение ячейки памяти с 0 адресом и выводим в UART
Serial.write(EEPROM.read(1));
Serial.write(EEPROM.read(2));
Serial.write(EEPROM.read(3));
Serial.print(
"\r\n"
);
// маркер конца передачи EEPROM данных
}
else
if
(FCMD == cmdw){
// если команда записи EEPROM данных
EEPROM.write(0,z1);
// запись z1 в ячейку памяти с адресом 0
EEPROM.write(1,z2);
EEPROM.write(2,z3);
EEPROM.write(3,z4);
timer_init();
// переинициализируем таймер
Serial.print(
"FWOK\r\n"
);
// посылаем сообщение, что данные успешно записаны
}
}
http://cxem.net/uprav/files/uprav46_BL_4WD.ino
Вот тут нашол проект, есть код но надо переделать под мой. WI FI
стоп-стоп, не так быстро
погодите минутку, мы пока определимся, кто именно будет ваш код переделывать, а то желающих-то полно, прямо рвут друг у друга. того и гляди подерутся. придется наверно жребий бросать.
не каждый день ведь такое счастье приваливает, да еще и даром....
Я особо в програмировании не разбираюсь.
Вот набросал скетч ля управление ботом, гляньте плиз.... может что упростить, переделать.
Управление камарой надо както сгладить.Что поворот бил плавний ане сразу с 90 га 180градусав.
Скетч:
#include <Servo.h>
Servo servo1;
Servo servo2;
const int SERVO1_PIN = 8;
const int SERVO2_PIN = 9;
const int MAX_POS = 1023;
const int MAX_ANGLE = 180;
int incomingByte;
void setup()
{
servo1.attach(SERVO1_PIN);
servo2.attach(SERVO2_PIN);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
Serial.begin(115200);
}
void loop()
{
if (Serial.available() > 0) {
incomingByte = Serial.read();
// Установка серво 1 в среднее положение
if (incomingByte == '5') {
servo1.write(90);
}
// Установка серво 2 в среднее положение
if (incomingByte == '5') {
servo2.write(90);
}
// При нажатой 8 повернуть серво 1 на 180 и при отсуствии возвратить в середину
if (incomingByte == '8') {
servo1.write(180);
delay(150);
servo1.write(90);
}
// При нажатой 2 повернуть серво 1 на 10 и при отсуствии возвратить в середину
if (incomingByte == '2') {
servo1.write(10);
delay(150);
servo1.write(90);
}
// При нажатой 4 повернуть серво 2 на 180 и при отсуствии возвратить в середину
if (incomingByte == '4') {
servo2.write(180);
delay(150);
servo2.write(90);
}
// При нажатой 6 повернуть серво 2 на 10 и при отсуствии возвратить в середину
if (incomingByte == '6') {
servo2.write(10);
delay(150);
servo2.write(90);
}
// При нажатой 7 повернуть серво 1 на 180 и при отсуствии возвратить в середину
// При нажатой 7 повернуть серво 2 на 180 и при отсуствии возвратить в середину
if (incomingByte == '7') {
servo1.write(180);
servo2.write(180);
delay(150);
servo1.write(90);
servo2.write(90);
}
// При нажатой 9 повернуть серво 1 на 180 и при отсуствии возвратить в середину
// При нажатой 9 повернуть серво 2 на 10 и при отсуствии возвратить в середину
if (incomingByte == '9') {
servo1.write(180);
servo2.write(10);
delay(150);
servo1.write(90);
servo2.write(90);
}
// При нажатой 1 повернуть серво 1 на 10 и при отсуствии возвратить в середину
// При нажатой 1 повернуть серво 2 на 180 и при отсуствии возвратить в середину
if (incomingByte == '1') {
servo1.write(10);
servo2.write(180);
delay(150);
servo1.write(90);
servo2.write(90);
}
// При нажатой 3 повернуть серво 1 на 10 и при отсуствии возвратить в середину
// При нажатой 3 повернуть серво 2 на 10 и при отсуствии возвратить в середину
if (incomingByte == '3') {
servo1.write(10);
servo2.write(10);
delay(150);
servo1.write(90);
servo2.write(90);
}
// При нажатой Q двигатся влево передним ходом
if (incomingByte == 'Q') {
digitalWrite(2, HIGH);
digitalWrite(5, HIGH);
delay(120);
digitalWrite(2, LOW);
digitalWrite(5, LOW);
}
// При нажатой W двигатся вперед
if (incomingByte == 'W') {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
delay(120);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
}
// При нажатой E двигатся вправопередним ходом
if (incomingByte == 'E') {
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
delay(120);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
// При нажатой A двигатся влево задним ходом
if (incomingByte == 'A') {
digitalWrite(4, HIGH);
digitalWrite(3, HIGH);
delay(120);
digitalWrite(4, LOW);
digitalWrite(3, LOW);
}
// При нажатой S двигатся назад
if (incomingByte == 'S') {
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
delay(120);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
}
// При нажатой D двигатся вправо задним ходом
if (incomingByte == 'D') {
digitalWrite(5, HIGH);
digitalWrite(2, HIGH);
delay(120);
digitalWrite(5, LOW);
digitalWrite(2, LOW);
}
// При нажатой R посигналить
if (incomingByte == 'R') {
digitalWrite(6, HIGH);
delay(120);
digitalWrite(6, LOW);
}
// При нажатой F включить фари
if (incomingByte == 'F') {
digitalWrite(7, HIGH);
}
// При нажатой G виключить фари
if (incomingByte == 'G') {
digitalWrite(7, LOW);
}
}
}
Жду вашых советов.
Спасибо!
Помогите...
Пожалуйста...
Чтобы плавно управлять камерой.
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
Для плавного поворота нужен цикл. Пример:
А вообще прежде чем что либо спросить необходимо дать схему устройства, схему подключения к контроллеру, код и только после задавать вопрос. Вам выше правильно сказали digitalWrite(action, HIGH); подаст на ногу action 5Вольт, но правильно это или нет не известно.
Для плавного поворота нужен цикл. Пример:
А вообще прежде чем что либо спросить необходимо дать схему устройства, схему подключения к контроллеру, код и только после задавать вопрос. Вам выше правильно сказали digitalWrite(action, HIGH); подаст на ногу action 5Вольт, но правильно это или нет не известно.
Значит с камерой разобрался.
Поворот медленный и плавный...
Вот:
int pos=90;
void loop()
{
if (Serial.available() > 0) {
incomingByte = Serial.read();
if (incomingByte == '5') {
pos = 90;
servo1.write(pos);
servo2.write(pos);
}
else if (incomingByte == '8') {
pos--;
servo1.write(pos);
}
else if (incomingByte == '2') {
pos++;
servo1.write(pos);
}
else if (incomingByte == '4') {
pos++;
servo2.write(pos);
}
else if (incomingByte == '6') {
pos--;
servo2.write(pos);
}
}
Подскажыта как реализовать ШИМ управление двигателями........ ? плавный старт...
pinMode(6, OUTPUT); // ШИМ
pinMode(7, OUTPUT); // ШИМ
pinMode(2, OUTPUT); // L298N пин 1
pinMode(3, OUTPUT); // L298N пин 2
pinMode(4, OUTPUT); // L298N пин 3
pinMode(5, OUTPUT); // L298N пин 4