Motor Shield v3 подключение TSOP
- Войдите на сайт для отправки комментариев
Чт, 24/01/2013 - 12:21
Помогите разобраться пожалуйсто.Купил Motor Shield v3 подключил к Ардуино Uno залил приложенный внизу скетч мониторинг порта выводит все действия, но мотор не запускается.Почему?
// Adafruit Motor shield library
// copyright Adafruit Industries LLC, 2009
// this code is public domain, enjoy!
#include <AFMotor.h>
#include <IRremote.h>
int RECV_PIN = 14;
IRrecv irrecv(RECV_PIN);
decode_results results;
AF_DCMotor motor(1);
void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Motor test!");
irrecv.enableIRIn(); // Start the receiver
// turn on motor
motor.setSpeed(200);
motor.run(RELEASE);
}
void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
if (results.value == 0xFFDA25){
uint8_t i;
Serial.print("tick");
motor.run(FORWARD);
for (i=0; i<255; i++) {
motor.setSpeed(i);
delay(10);
}
for (i=255; i!=0; i--) {
motor.setSpeed(i);
delay(10);
}
Serial.print("tock");
motor.run(BACKWARD);
for (i=0; i<255; i++) {
motor.setSpeed(i);
delay(10);
}
for (i=255; i!=0; i--) {
motor.setSpeed(i);
delay(10);
}
Serial.print("tech");
motor.run(RELEASE);
delay(1000);}
irrecv.resume(); // Receive the next value
}
}
Причин может быть много. И почему вы решили что дело к коде, выбрав этот раздел форума...
0. Что за шилд? Описание на него есть? Они разные бывают.
1. Вы внешнее питание к шилду подключили?
2. Куда подключили?
3. Что за мотор?
4. Куда мотор подключили?
Так же посмотрите как правильно всталять код в сообщение.
написал же Motor Shield v3
подключил движек от какой то радиоуправляемой игрушки к контактам M1.Он работает в тестовом режими скетч которого идет с библиотекой http://www.ladyada.net/make/mshield/download.html на данный шилд.Питание шилда идет от платы ардуино которая запитана блокм питания 5 V
// Adafruit Motor shield library // copyright Adafruit Industries LLC, 2009 // this code is public domain, enjoy! #include <AFMotor.h> #include <IRremote.h> int RECV_PIN = 14; IRrecv irrecv(RECV_PIN); decode_results results; AF_DCMotor motor(1); void setup() { Serial.begin(9600); // set up Serial library at 9600 bps Serial.println("Motor test!"); irrecv.enableIRIn(); // Start the receiver // turn on motor motor.setSpeed(200); motor.run(RELEASE); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); if (results.value == 0xFFDA25){ uint8_t i; Serial.print("tick"); motor.run(FORWARD); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } Serial.print("tock"); motor.run(BACKWARD); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } Serial.print("tech"); motor.run(RELEASE); delay(1000);} irrecv.resume(); // Receive the next value } }// Adafruit Motor shield library // copyright Adafruit Industries LLC, 2009 // this code is public domain, enjoy! #include <AFMotor.h> #include <IRremote.h> int RECV_PIN = 14; IRrecv irrecv(RECV_PIN); decode_results results; AF_DCMotor motor(1); void setup() { Serial.begin(9600); // set up Serial library at 9600 bps Serial.println("Motor test!"); irrecv.enableIRIn(); // Start the receiver // turn on motor motor.setSpeed(200); motor.run(RELEASE); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); if (results.value == 0xFFDA25){ uint8_t i; Serial.print("tick"); motor.run(FORWARD); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } Serial.print("tock"); motor.run(BACKWARD); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } Serial.print("tech"); motor.run(RELEASE); delay(1000);} irrecv.resume(); // Receive the next value } }написал же Motor Shield v3
подключил движек от какой то радиоуправляемой игрушки к контактам M1.Он работает в тестовом режими скетч которого идет с библиотекой http://www.ladyada.net/make/mshield/download.html на данный шилд.Питание шилда идет от платы ардуино которая запитана блокм питания 5 V
Arduino Motor Shield V3
Motor Shield v3
А то что у вас на картинке это вообще Motor Shield v2 так что если спрашивают, то не просто так.
Перемычка в каком RWR Sel в каком положении стоит? в Ext или Ard?
в правом
тестовый режим работает отлично
// Adafruit Motor shield library // copyright Adafruit Industries LLC, 2009 // this code is public domain, enjoy! #include <AFMotor.h> AF_DCMotor motor(4); void setup() { Serial.begin(9600); // set up Serial library at 9600 bps Serial.println("Motor test!"); // turn on motor motor.setSpeed(200); motor.run(RELEASE); } void loop() { uint8_t i; Serial.print("tick"); motor.run(FORWARD); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } Serial.print("tock"); motor.run(BACKWARD); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } Serial.print("tech"); motor.run(RELEASE); delay(1000); }Значит не работает ИК-приемник или пульт.
по поводу шилда у меня 3 версия,картинку не ту выложил просто
конечно
ик работает на терминале выводятся все значения полученные с пульта,а так же отоброжается процец начало разгона и торможения
Так, давайте по порядку - как и куда подключаете ИК приемник и каким пультом пользуетесь?
UPD: вот опять вопрос позже чем ответ.
Проверьте так работает?
#include <IRremote.h> #include <AFMotor.h> AF_DCMotor motor(4); int RECV_PIN = 14; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); Serial.println("Motor test!"); motor.setSpeed(200); motor.run(RELEASE); } void loop() { byte i; Serial.print("tick"); motor.run(FORWARD); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } Serial.print("tock"); motor.run(BACKWARD); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } Serial.print("tech"); motor.run(RELEASE); delay(1000); }ик сначало подключил ко второму пину потом уже нерекинул на 14 (аналоговый 0), пульт от проигрывателя mystery MDV-729U.tsop 2238 снять с проигрывателя самсунг подключен к питанию средней ногой 5v, правая нога gnd платы шилда левая соответственно сигнал на 14 пине
Если работает, то проверьте работает ли так
#include <IRremote.h> #include <AFMotor.h> AF_DCMotor motor(4); int RECV_PIN = 14; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); Serial.println("Motor test!"); motor.setSpeed(200); motor.run(RELEASE); irrecv.enableIRIn(); // Start the receiver } void loop() { byte i; Serial.print("tick"); motor.run(FORWARD); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } Serial.print("tock"); motor.run(BACKWARD); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } Serial.print("tech"); motor.run(RELEASE); delay(1000); }обычный тестовый режим вот наблюдаю разгон и замедление
И первый и второй примеры работают?
я так понимаю разница состоит во включении ик?в этот раз не пошло!
вот убрал включение ик и работает
AF_DCMotor motor(4); у меня мотор на первомAF_DCMotor motor(1);
В общем вы были правы, дело именно в программной части, дело в несовместимости библиотек, так как у вас УНО они обе используют TIMER1. Так как обе библиотеки используют 16-битный таймер, а у Уны он один, то просто сменить в одной из библиотек номер таймера думаю не получится, поэтому вам нужно либо отказаться от использования от одной из библиотек, либо найти/переписать библиотеку под 8-битный таймер.
хм не лучшая перспектива.а в принципе наверно можно напряму обращаться к пинам которые управляют шилдам?я нуб в програмирование и чаще жму ctrl/c/v ))
большое спасибо
хм не лучшая перспектива.а в принципе наверно можно напряму обращаться к пинам которые управляют шилдам?я нуб в програмирование и чаще жму ctrl/c/v ))
Направление двигателей задается через сдвиговый регистр, а скорость ШИМом (по-моему 9 и 10 вывод), но если вы будете искользовать функцию analogWrite(), то двигатели будут пищать на неполных оборотах, поэтому лучше таймер пожертвовать на управление двигателями. Я бы на вашем месте написал код для демодуляции и дешифровки ИК-сигнала, использовав внешнее прерывание и функцию micros(). Но решать вам, что для вас приорететнее или проще реализуемо.
При использовании таймера1 пользоваться analogWrite() на этих пинах уже нельзя.
Посмотрел исходники. Для М1 М2 используется TIMER2, для М3 и М4 - TIMER0 (Для случая УНО и подобных, на МЕГЕ - другие) На сколько мне помнится, IRremote использует TIMER2. Так что можно попробовать пользоваться только М3 и М4 и инициализировать пульт после моторов. Ну или заремарить TIMER2 в библиотеке (и все равно забить на М1 и М2)
Да ,точно, на 9 и 10 выводах воспользоваться функцией analogWrite() не получится, после того как проинициализируете IRremote. Так что лучше еще один аргумент что бы отказаться от библиотеки IRremote.
Да, точно. Посмотрел исходник IRremote - используется TIMER2 и весьма непросто ее переписать на другой таймер. Так что только 2 мотора или один шаговик.
Действительно, TIMER2
хотя всегда думал, что первый.
Как все сложно.На M(3) заработало.А шаговый только на эти же клемы посадить можно?
А в принцепи можно как то выключать библиотеку на время а потом включать или я чушь несу?
Да, шаговик тоже только на М3 и М4.
Попеременно таймер можно использовать, только как это поможет?
допустим понадобится использовать шаговик не упровляемый пультом
отключать именно таймер надо или все же библиотеку?
Нет, всю библиотеку не нужно. Библиотека не захватывает таймер, пока Вы не объявляете объект типа мотор или шаговик, которому этот таймер нужен. Так что нужно удалить объект IRremote, потом объявить мотор. И наоборот. Может можно и не удалять, но, боюсь, это будет неправильно.
Так что библиотеки и таймеры не надо отключать, надо "дестроить" объекты, их использующие.
Действительно, TIMER2
хотя всегда думал, что первый.
У нас еще и библиотеки разные, у меня жестко timer2. У меня такая:
то есть при необходимости отключить програмным путем датчик?
irrecv.enableIRIn(); // Start the receiver
irrecv.disabledIRIn();\\это отключит ик?
disabledIRIn() - такой функции нет (я не нашел).
enableIRIn() - как раз захватывает таймер. Да, включит.
а как тогда его отключить ?
Да, собственно, никак... Объявляете AF_DCMotor myMotor(1);
и все! Таймер перехвачен. Приемник перестает работать. Точнее, не перестает, но не принимает, потому что настройки таймера уже другие.
Вот что я нашел в либе IRremote
// defines for timer1 (16 bits) #elif defined(IR_USE_TIMER1) #define TIMER_RESET #define TIMER_ENABLE_PWM (TCCR1A |= _BV(COM1A1)) #define TIMER_DISABLE_PWM (TCCR1A &= ~(_BV(COM1A1))) #if defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__) #define TIMER_ENABLE_INTR (TIMSK = _BV(OCIE1A)) #define TIMER_DISABLE_INTR (TIMSK = 0) #else #define TIMER_ENABLE_INTR (TIMSK1 = _BV(OCIE1A)) #define TIMER_DISABLE_INTR (TIMSK1 = 0) #endif #define TIMER_INTR_NAME TIMER1_COMPA_vect #define TIMER_CONFIG_KHZ(val) ({ \ const uint16_t pwmval = SYSCLOCK / 2000 / (val); \ TCCR1A = _BV(WGM11); \ TCCR1B = _BV(WGM13) | _BV(CS10); \ ICR1 = pwmval; \ OCR1A = pwmval / 3; \ }) #define TIMER_CONFIG_NORMAL() ({ \ TCCR1A = 0; \ TCCR1B = _BV(WGM12) | _BV(CS10); \ OCR1A = SYSCLOCK * USECPERTICK / 1000000; \ TCNT1 = 0; \ }) #if defined(CORE_OC1A_PIN) #define TIMER_PWM_PIN CORE_OC1A_PIN /* Teensy */ #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) #define TIMER_PWM_PIN 11 /* Arduino Mega */ #elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) #define TIMER_PWM_PIN 13 /* Sanguino */ #else #define TIMER_PWM_PIN 9 /* Arduino Duemilanove, Diecimila, LilyPad, etc */ #endifа значит она может работать и с 16-битным таймером.
В общем делаете так - находите файл arduino\libraries\IRremote\IRremoteInt.h, открываете его (например с помощью WordPad), находите строки:
и делаете так:
После данных манипуляций перезапускаете ArduinoIDE и пробуете, теперь IRremote должна использовать TIMER1, а AFMotor таймеры TIMER0 и TIMER2.
не нашел
Скачайте вот эту либу. Только переименуйте папку Arduino-IRremote-master в IRremote.
она уже измененная по таймеру?
Нет, в ней есть те строки, которые вы не нашли в своей.
мне свою библиотеку заменить этой?
Конечно.
#include <AFMotor.h> #include <IRremote.h> #include <CyberLib.h> AF_DCMotor motor1(1); AF_DCMotor motor2(2); IRrecv irrecv(16); //вход для ик приемника decode_results results; unsigned long ir_go, ir_back, ir_left, ir_right, ir_stop, ir_tmp; void setup() { motor1.setSpeed(200); motor2.setSpeed(200); motor1.run(RELEASE); motor2.run(RELEASE); D14_Out; //пищалкка D15_In; //вход кнопки D15_High; //включить подтяжку irrecv.enableIRIn(); // включить приемник irrecv.blink13(true); // включить мигание светодиода при приеме ProgPush() ; //программирование кнопок ir_go=ReadEEPROM_Long(0);//прочитать команду из EEPROM ir_back=ReadEEPROM_Long(1);//прочитать команду из EEPROM ir_left=ReadEEPROM_Long(2);//прочитать команду из EEPROM ir_right=ReadEEPROM_Long(3);//прочитать команду из EEPROM ir_stop=ReadEEPROM_Long(4);//прочитать команду из EEPROM beep(50,100); beep(50,1000); beep(50,500); beep(50,300); beep(50,500); beep(50,600); beep(50,200); beep(50,170); beep(50,900); beep(50,1000); //Сторожевая собака 8сек. } void loop() { Start if (irrecv.decode(&results)) //если был сигнал с пульта { ir_tmp=results.value; if(ir_go==ir_tmp) //если принятый код равен коду который в памяти то вперед { motor1.run(FORWARD); motor2.run(FORWARD); beep(100,300); } else if(ir_back==ir_tmp) //если принятый код равен коду который в памяти то назад { motor1.run(BACKWARD); motor2.run(BACKWARD); beep(100,400); } else if(ir_left==ir_tmp) //если принятый код равен коду который в памяти то назад { motor2.run(BACKWARD); motor1.run(FORWARD); beep(100,450); } else if(ir_right==ir_tmp) //если принятый код равен коду который в памяти то назад { motor1.run(BACKWARD); motor2.run(FORWARD); beep(100,500); } else if(ir_stop==ir_tmp) //если принятый код равен коду который в памяти то стоп { motor1.run(RELEASE); motor2.run(RELEASE); beep(10,300); beep(10,400); beep(10,300); } irrecv.resume(); //очистить входящий буфер } //покормить собаку, что бы она не сбежала End } ////////////////////////////////////////////////////////////////////////////////////////////// void SavePush(uint8_t addr) //сохранить нажатие кнопки { delay_ms(400); //задержка для крректной работы for(uint32_t i=0; i<2000000; i++)//ждем нажатия кнопки пульта { if (irrecv.decode(&results)) //если был сигнал с пульта { // то сохраняем результат в EEPROM WriteEEPROM_Long(addr, results.value); break; //прервать цикл } } delay_ms(100); irrecv.resume(); //очистить входящий буфер } void beep(byte dur, word frq) { dur=(1000/frq)*dur; //расчет длительности бипа for(byte i=0; i<dur; i++) { D14_High; delay_us(frq); D14_Low; delay_us(frq); } } ////////////////////////////////////////////////////////////////////////////////////////////////// void ProgPush() { if(D15_Read==0)//если кнопка нажата { beep(30,800); beep(30,900); beep(30,1000); SavePush(0); //сохранить первое кодовое значение пульта beep(50,800); SavePush(1); //сохранить второе кодовое значение пульта beep(50,900); SavePush(2); //сохранить третье кодовое значение пульта beep(50,850); SavePush(3); //сохранить четвертое кодовое значение пульта beep(50,950); SavePush(4); //сохранить пятое кодовое значение пульта beep(30,1000); beep(30,900); beep(30,800); } }совместил пару программ
Скачайте вот эту либу. Только переименуйте папку Arduino-IRremote-master в IRremote.
Прошу прощения, скачал по ссылке. Указанных строк тоже не нахожу...
За все эти долгие годы придумано, как подружить IRRemote и Tone?
Эти строки находятся в файле boarddefs.h