Библиотека VirtualWire и ШИМ на 9-10 pin
- Войдите на сайт для отправки комментариев
Втр, 26/11/2013 - 22:01
При подключении вышеупомянутой библиотеки проподает ШИМ на 9-ом и 10-м пине. Из этого обсуждения понял что разрулить переназначением портов не получиться. Возникает устойчивое подозрение, что придется мутить програмный ШИМ на этих выходах, но я этого не умею.... может есть примеры кода?
Пример кода если что:
#include <VirtualWire.h>
int nn = 0;
void setup() {
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
vw_set_ptt_pin(12);
vw_set_rx_pin(7);
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(1700); // Bits per sec
vw_rx_start();
}
void loop() {
analogWrite(10,nn);
analogWrite(9,nn);
delay(1000);
if (nn<250)
{
nn= nn +10;
}
}
или может проще заставить virtualwire использовать timer2?
Вот такой скетч получился
#include <VirtualWire.h> //- библиотека безпроводной связи #include <SPI.h> int REG1 = 8; //- пин, управляющий защёлкой сдвигового регистра (SS в терминах SPI) int Moto1L = 3; //-если 1 то крутит мотор влево int Moto1R = 2; //-если 1 то крутит мотор вправо int Moto1Cont = 10; //- пин с ШИМ управляющий скоростью первого двигателя int Moto2L = 5; //-если 1 то крутит мотор влево int Moto2R = 4; //-если 1 то крутит мотор вправо int Moto2Cont = 9; //- пин с ШИМ управляющий скоростью второго двигателя int speed_left = 5; int speed_right = 5; int abs_speed_left = 0; int abs_speed_right = 0; int takt = 0; int light = 0; int currentTime = 0; int loopTime = 0; void setup() { //Serial.begin(9600); // Debugging only pinMode(REG1, OUTPUT); pinMode(Moto1L, OUTPUT); pinMode(Moto1R, OUTPUT); pinMode(Moto1Cont, OUTPUT); pinMode(Moto2L, OUTPUT); pinMode(Moto2R, OUTPUT); pinMode(Moto2Cont, OUTPUT); digitalWrite(Moto1Cont,LOW); digitalWrite(Moto2Cont,HIGH); writeShiftRegister(REG1, 0); // Initialise the IO and ISR vw_set_rx_pin(7); vw_set_ptt_inverted(true); // Required for DR3100 vw_setup(1700); // Bits per sec vw_rx_start(); currentTime = millis(); // считываем время, прошедшее с момента запуска программы loopTime = currentTime; } void writeShiftRegister(int ss_pin, uint8_t value) { SPI.begin(); digitalWrite(ss_pin, LOW); SPI.transfer(value); digitalWrite(ss_pin, HIGH); SPI.end(); } void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; if (vw_get_message(buf, &buflen)) // Non-blocking { if (buflen == 2) {//значит наверно это команда //Serial.println("command"); uint8_t command1 = buf[0]; uint8_t command2 = buf[1]; if (command1/16 == 1) {// значит это команда устройству 1 и нам надо ее обработать speed_left = constrain(bitRead(command1,3)*8+bitRead(command1,2)*4+bitRead(command1,1)*2+bitRead(command1,0),1,9); speed_right = constrain(bitRead(command2,7)*8+bitRead(command2,6)*4+bitRead(command2,5)*2+bitRead(command2,4),1,9); light = constrain(bitRead(command2,3)*2+bitRead(command2,2),0,3); //speed_propellers = constrain(bitRead(command2,1)*2+bitRead(command2,0),0,3); //управляем левым двигателем if (speed_left < 5) { digitalWrite(Moto1L, HIGH); digitalWrite(Moto1R, LOW); // analogWrite(Moto1Cont, map(speed_left,1,4,0,255)); } else if (speed_left > 5) { digitalWrite(Moto1L, LOW); digitalWrite(Moto1R, HIGH); // analogWrite(Moto1Cont,map(speed_left-5,4,1,0,255)); } else if (speed_left == 5) { digitalWrite(Moto1L, LOW); digitalWrite(Moto1R, LOW); // analogWrite(Moto1Cont,0); } //управляем правым двигателем if (speed_right < 5) { digitalWrite(Moto2L, HIGH); digitalWrite(Moto2R, LOW); //analogWrite(Moto2Cont, map(speed_right,1,4,0,255)); } else if (speed_right > 5) { digitalWrite(Moto2L, LOW); digitalWrite(Moto2R, HIGH); //analogWrite(Moto2Cont,map(speed_right-5,4,1,0,255)); } else if (speed_right = 5) { digitalWrite(Moto2L, LOW); digitalWrite(Moto2R, LOW); // analogWrite(Moto2Cont,0); } abs_speed_left = abs(speed_left-5); abs_speed_right = abs(speed_right-5); // управляем светом if (light == 0) { writeShiftRegister(REG1, 0); } else if (light == 1) { writeShiftRegister(REG1, 24); } else if (light == 2) { writeShiftRegister(REG1, 126); } else if (light == 3) { writeShiftRegister(REG1, 255); } } } } currentTime = millis(); // считываем время, прошедшее с момента запуска программы if(currentTime >= (loopTime + 12)){ // сравниваем текущий таймер с переменной loopTime + 30 милисекунд //digitalWrite(Moto1Cont, !digitalRead(Moto1Cont)); //digitalWrite(Moto2Cont, !digitalRead(Moto2Cont)); digitalWrite(Moto1Cont, ((abs_speed_left-takt)>0)); digitalWrite(Moto2Cont, ((abs_speed_right-takt)>0)); // включаем/выключаем LED loopTime = currentTime; // в loopTime записываем новое значение takt = takt+1; if (takt > 3) { takt = 0; } } }Мне нужно управлять двумя моторами через драйвер l293, по этому разрядность ШИМа всего 4 и это меня устраивает, но при уменьшении времени повторения (увеличения частоты ШИМа) наблюдается странный эффект: через некоторое время 10 пин становится постоянно HIGH, а 9 LOW, вне зависимости от посылаемых команд, однако состоянием остальных выводом можно управлять, так например SPI продолжает работать и мотор на 10 пине продолжает менять направление вращения и останавливаться по команде с пульта.
Может лучше использовать для этих целей прерывание по переполнению timer2? Но этого я пока не освоил, буду читать дальше…
p.s.
не уверен в правильности использования терминов частота и разрядность