Задача - управлять роботом с двумя моторами через XBee с помощью Serial команд. XBee прошиты на AT команды. Нужно передать данные с двух потенциометров так чтобы на приемнике эти два числа отправились туда куда нужно. Я решил передавать данные в зашифрованном формате а на приемнике расшифровывать и отправлять на нужный мотор. Вот мои скетчи: Для передатчика: Для приёмника: Как вы поняли для левого мотора данные отправляются после пропускания через map(x,0,1023,0,127) , а к правым помимо map() прибавляется 128 . В таком виде данные должны идти на приемник и там сравниваться с 127 и 128, если меньше 128 значит данные для левого мотора, а если больше 127 то нужно вычесть 128 и отправить в правый мотор. Но когда ардуино поработает около 5 сек он внезапно теряет сигнал от XBee и лампочка rssi гаснет, затем ещё через 5 сек он вновь начинает работать . То есть появляется ощущение что дуни работают асинхронно, но если заменить задержки на передатчике на 4000 мс все работает как надо за исключением очень долгого получения данных на приемнике. Подскажите что исправить. Есть вопросы - спрашивайте
В чем заключалась проблема прошивки XBee? У меня правда не XBee, а APC220, но симптомы похожие: платформа ездит секунд 10-15, потом останавливается, мигает лампочками и едет дальше.
Код (Text): #include <Servo.h> int M1 = 4; int E1 = 5; int E2 = 6; int M2 = 7; int speed_Left, speed_Right, ServoPos; Servo myservo; void setup() { Serial1.begin(9600); myservo.attach(3); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); } void loop() { while (Serial1.read() != '!'); speed_Left = Serial1.parseInt(); speed_Right = Serial1.parseInt(); ServoPos=map(Serial1.parseInt(), -255, 255, 20,160); if (speed_Left > 50) //вперед { analogWrite (E1,abs(speed_Left)); //PWM Speed Control digitalWrite(M1,HIGH); } else if (speed_Left < -50) //назад { analogWrite (E1,abs(speed_Left)); //PWM Speed Control digitalWrite(M1,LOW); } else { digitalWrite(E1,LOW); //стоп } if (speed_Right > 50) //вперед { analogWrite (E2,abs(speed_Right)); //PWM Speed Control digitalWrite(M2,HIGH); } else if (speed_Right < -50) //назад { analogWrite (E2,abs(speed_Right)); //PWM Speed Control digitalWrite(M2,LOW); } else { digitalWrite(E2,LOW); //стоп } myservo.write(ServoPos); } Плата DFRobot Romeo v.2 С компьютера передаю 3 числа через запятую. В начале строки '!'.
В коде ничего преступного на первый взгляд не видно. Попробуйте отладочный вывод повтыкать повсюду - узнаете, в каком месте и в какой момент программа слетает. Еще можно кусками комментировать программу и смотреть, изменится ли поведение - так найдете часть кода с глюком.