Здравствуйте! В ходе подготовки к диплому возникла нужда в изготовлении робота собственными силами... Остановился на ардуино потому, что были в наличии радиомодули NRF24l01, а примеры работы с ними были только на ардуино. Электроникой занимаюсь около восьми лет, а вот программированием - с недавнего времени, так что мои глубочайшие извинения за безграмотность. Собственно, это ещё один аргумент в пользу того же ардуино... Итак, идея состоит в следующем. Робот - охранник катается взад-вперед по одной линии, периодически останавливается и проверяет по датчику движения наличие присутствия чего-либо. Если что не так, подает сигнал... Да хоть звуковой. При необходимости оператор переключает управление на себя, и рулит роботом посредством того же радиомодуля. На роботе установлена независимая от ардуино аналоговая радиокамера. Ардуино собрано самостоятельно, как для передатчика, так и для приемника, как и шилд управления двигателями на L293D, нашел удобный код для радиоуправления, переделал его под свои нужды, платформа также изготовлена из древних конструкторов и игрушек, а также компьютерной мыши, но никак не могу решить вопрос: как по внешней команде включать/выключать управление управление роботом? То есть идея такая: нажали на пульте кнопку вкл - робот останавливает своё блуждание и управляется только с пульта. Нажали выкл - бродит и ищет нарушителей)) Код такой: Код (Text): #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Servo.h> Servo myservo; #define CE_PIN 9 #define CSN_PIN 10 int pwm = 0; const uint64_t pipe = 0xE8E8F0F0E1LL; RF24 radio(CE_PIN, CSN_PIN); int joystick[5]; void setup() { delay(1000); radio.begin(); radio.openReadingPipe(1,pipe); radio.startListening(); myservo.attach(5); pinMode(1, OUTPUT); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); } void loop() { if ( radio.available() ) { bool done = false; while (!done) { done = radio.read( joystick, sizeof(joystick) ); myservo.write(joystick[0]); digitalWrite(1, !joystick[1]); digitalWrite(2, !joystick[2]); digitalWrite(3, !joystick[3]); digitalWrite(4, !joystick[4]); } } else { } } Пршу вас направить на мысль, в каком направлении копать... Выглядит девайс так:
Код (Text): bool Manual = false; void loop() { // прием команд по радио if(Manual) { // управление с пульта } else { // автономный режим } } Переменную меняете по приходу нужной команды.
Увы, не работает вообще, хоть и компилируется. И, насколько понимаю, при таком коде он будет выключаться один раз - и всё. Потому что команд с радио принимать больше не будет и переменная меняться, соответственно, тоже не будет... Если не прав, поправьте, плиз)
Надо делать (я во всяком случае так поступаю) по частям. Сначала отработали автономный режим. Потом отработали управление с пульта. Только потом объединяем.
Код (Text): bool Manual = false; void loop() { ReceiveCommand(); if(Manual) { // управление с пульта } else { // автономный режим } } void ReceiveCommand() { // тут при наличии новой команды меняются переменные, // задающие режим работы } Я примерно такой алгоритм имел ввиду. Ветка приема команд работает всегда. По приему нужной команды меняется переменная. От состояния этой переменной зависит режим работы робота.
Так код управления вполне рабочий, робот бодро катается, серва крутится... Если заливаю простенький скетч реакции на движение, то же всё норм. вот собственно и соединяю...
Спасибо! Я несмного не так понял... Пробовал делать так: при нажатии на одну из кнопок выполняются команды с пульта, если нет нажатия - выполняется код блинк, для примера, естесно, не на 13 выводе... вообще тишина. Попробую с переменной, как Вы советовали, хотя пока и не очень ясно себе это представляю)