Проблема в коде
- Войдите на сайт для отправки комментариев
Пт, 14/03/2014 - 14:14
Здраствуйте, у меня в этом коде не работает motorлевый, а точнее не подается ШИМ сигнал на 5-pin.
С другой программой работает.
#include "leOS.h" leOS myOS; //motorПравый #define dir1PinA 8 //Серый #define dir2PinA 7 //Белый #define speedA 10 //motorЛевый #define dir1PinB 4 //Чёрный #define dir2PinB 2 //Коричневый #define speedB 5 //вот этот pin //Sensors// #define outputPin 6 //подключил к ШИМ Ультрозвуковой датчик #define inputPin 9 //Echo //Random// #define TimeDelay random(500, 3500) void setup() { Serial.begin(9600); myOS.begin(); pinMode(dir1PinA, OUTPUT); pinMode(dir2PinA, OUTPUT); pinMode(dir1PinB, OUTPUT); pinMode(dir2PinB, OUTPUT); pinMode(inputPin, INPUT); //УЗ-датчик pinMode(outputPin, OUTPUT); //УЗ-датчик myOS.addTask(sensor1, 300); //выполнение задачи раз в 100 мс } void sensor1() { //sensor// digitalWrite(outputPin, LOW); delayMicroseconds(2); digitalWrite(outputPin, HIGH); delayMicroseconds(10); digitalWrite(outputPin, LOW); int distance = (pulseIn(inputPin, HIGH))/58; Serial.print(distance); Serial.print(" cm"); Serial.println(" "); // действи на значение sensor if(distance < 25) travel(HIGH,LOW,HIGH,LOW,80); //едем назад } void loop() { //едем куда хотим byte napravlenie = random(1, 5); switch (napravlenie) { case 1: travel(HIGH,LOW,LOW,HIGH,80); //поворачиваем направо case 2: travel(LOW,HIGH,HIGH,LOW,80); //поворачиваем налево case 3: travel(LOW,HIGH,LOW,HIGH,80); //едем Вперед case 4: travel(LOW,LOW,LOW,LOW,0); //стоп } } void travel(bool zadRight, bool perRight, bool zadLeft, bool perLeft, byte speedRL) { digitalWrite(dir1PinA, zadRight); digitalWrite(dir2PinA, perRight); digitalWrite(dir1PinB, zadLeft); digitalWrite(dir2PinB, perLeft); analogWrite(speedA, speedRL); analogWrite(speedB, speedRL); delay(TimeDelay); }
Не работает даже если поменять на другой пин
pinMode?
попробуйте добавить в
setup
()
pinMode(speedB, OUTPUT);
не работает
Мож быть leOs пакостит? :)
Мож быть leOs пакостит? :)
Кстати вполне вероятно. Она похоже использует Timer2 для диспетчерезации, то есть все функции которые на нее превешены выполняются, фактически, "внутри обработчика прерывания". А мы видим, внутри превешенной функции и delay, pulseIn и serial.print.... вообщем почти все способы "выстрелить себе в ногу" применены.
Не считая того, что она может дергать travel одновременно с его же вызовами из loop()
тогда передложите замену leOS (параллельное выполнение программы)
На 8-ми битниках, паралельного выполнения - не бывает. В том числе и с leOs. Только "псевдо".
А заменой является отказ от delay(), pulseIn и проч. блокирующий функций (которые останавливают скетч).
Все писать только с использованием millis()/micros(), запоминанием времени в переменные, просмотром в loop() "настало время или нет", в обработчких прерывание выставлять какие-нибудь "флаги/переменные", указывающие "нужно что-то сделать" (скажем вывести переменную в Serial). А сам вывод - делать в loop().
Начинать разбирательство "какая бывает жизнь без delay()". Можно с примера:Мигаем светодиодом без delay()
Ну и сам форум пошерстить на эту тему. Веток связанных с этим можно найти не одну и не две. Десятки минимум.
Но.... прежде чем "начать все переделывать с нуля". Закоментируйте, для начала, эту leOs и функцию sensor1(). Убедитесь что причина именно в ней. Что, после этого, на пине появится желанный PWM.
без него работает, спасибо большое
Ну тогда переделывайте, на безделейность (leOs) - нафиг. sensor1() - пока оставте. Просто временно не вызывайте. Пригодится чуть позже.
Суть переделки примерно такова:
нам нужно разбить функцию travel(), на две функции. setTravel(
bool
zadRight,
bool
perRight,
bool
zadLeft,
bool
perLeft,
byte
speedRL
) и doTravel()setTravel() - будет делать примерно то же самое что и сейчас, только вместо "сразу выставить пины" в то что ей передали, она просто сохраняет свои параметры в глобальные переменные (ну соотвественно нужно объявить эти переменные).
doTravel() - постоянно вызвается из loop(). Как можно чаще. Делает она одно - берет значение из переменных (которые заполнила setTravel()) и выставляет эти значение на пины.
Саму setTravel(), мы вызваем "переодически", но переодичность обеспечивает не с помощью delay(), а с помощью механизма Мигаем светодиодом без delay() . Только вы будете не диод включать, а делать свой random() и setTravel()
И наверное менять направление каждые 80 мсек - это будут "пляски святого вита". Чуть поболее время возмите...
Я в тупике.
>Я в тупике.
OK. Поехали тогда пошагово.
setTravel(). "вместо "сразу выставить пины" в то что ей передали, она просто сохраняет свои параметры в глобальные переменные "
1. Завидите пять глобальных переменных
2. setTravel, вместо вызова digitalWrite() должна просто сохранять свои входные параметры в эти переменные.
Вот примерно так: (пример сохранения одного параметра, а у вас их пять):
Сделайте, по аналогии, setTravel и покажите ее тут (вместе с объявлением глобальных переменных). Остальное - пока не нужно.