#include "Servo.h"
#include "Ultrasonic.h"
Ultrasonic ultrasonic(11, 5);
#include <DRV8835MotorShield.h>
DRV8835MotorShield motors;
Servo serva;
int x=0;
int y=0;
int speed = 0;
void setup(){serva.attach(3);
serva.write(123);}
void loop()
{
if (ultrasonic.Ranging(CM)<=25)
{goto prog1;delay(2);}
else {int speed = 100; motors.setM1Speed(-speed);
motors.setM2Speed(-speed);delay(2);}
prog1:
serva.write(143);
delay (1000);
if (ultrasonic.Ranging(CM)<=25)
{x=x+1;serva.write(163);delay(1000);}
else
{serva.write(163);delay(1000);}
if (ultrasonic.Ranging(CM)<=25)
{x=x+1;serva.write(183);delay(1000);}
else
{serva.write(183);delay(1000);}
if (ultrasonic.Ranging(CM)<=25)
{x=x+1;serva.write(203);delay(1000);}
else
{serva.write(203);delay(1000);}
if (ultrasonic.Ranging(CM)<=25)
{x=x+1;serva.write(43);delay(1000);}
else
{serva.write(43);delay(1000);}
if (ultrasonic.Ranging(CM)<=25)
{y=y+1;serva.write(63);delay(1000);}
else
{serva.write(63);delay(1000);}
if (ultrasonic.Ranging(CM)<=25)
{y=y+1;serva.write(83);delay(1000);}
else
{serva.write(83);delay(1000);}
if (ultrasonic.Ranging(CM)<=25)
{y=y+1;serva.write(103);delay(1000);}
else
{serva.write(103);delay(1000);}
if (ultrasonic.Ranging(CM)<=25)
{y=y+1;serva.write(123);delay(1000);}
else
{serva.write(123);delay(1000);}
}
оформи нормально. посмотри как вставлять код правильно. 1 сообщение не редактируется
Всем, здравствуйте! Я новичек в Ардуино. Давеча начал разбираться с драйвером двигателя Pololu DRV8835. У него своя библиотека. Написал скетч проверочный и не пойму, почему двигатели всегда крутятся, причем один быстрее другого? Вне зависимости от проверочной команды if. Подружить не получается сервопривод, два двигателя и ультразвуковой сенсор. В паре работают в любой комбинации. Только что делал двигатели и ультразвук - работают, платформа останавливается при приближении к препятствию и поворачивается в право. Сервопривод с ультразвуком тоже работает, все поворачивается. А вместе втроем не хотят работать(.
это что еще за goto))) зачем?
Согласен, неазчем. Но я думал, что закливание происходит на строке двигателей, каким то образом. И решил принудительно отправить на нужную строку
Суть в том, чтобы платформа при обнаружении препятствия останавливалась и начинала крутить сервой по сторонам, делая замер дистанции на каждом повороте сервы с шагом 20 градусов. Чтобы потом решить в какую сторону поворачиваться от препятствия.
оформи нижнюю часть как функцию, условие если растояние меньше ... то остановить двигатель и вызвать эту функцию
Сделал вот так, все равно работает неадекватно. Серва вообще молчит, хотя указано выставить в void setup на 123 градуса. Серву поменял на другую, такая же ситуация, как буд-то конфликтует оборудование друг с другом. Питание от 4х аккумов, 5.37В. Запитанно на драйвер двигателя, с него питается Ардуино.
А для чего вот эта пачка if..else?
чтобы интереснее было
Для того чтобы в конце получить некое суммарное значение измерений Х и Y, и сравнить их между собой. Просто пока не знаю, как по другому это реализовать. Может код и не совсем красивый, но я его еще не оптимизировал. Он просто не работает, а ошибки не вижу. Вот и попросил совета у знающих.
я честно сказать на тот кусок и не смотрел почти. оформление убивает и отбивает желание смотреть что там делается
Arduino UNO R3 стоит на гусеничной платформе с двумя электродвигателями. На платформе также стоит сервопривод SG90 к которому прикреплен датчик HC-SR04. Задача: ехать прямо, выровнять датчик сервоприводом в сторону движения serva.write(123) (методом тыка был обнаружен угол в 123 градуса, который соответствует направлению движения и направлению датчика), при срабатывании ultrasonic.Ranging(CM)<=8 остановиться и начать оглядываться сервой с шагом по 20 градусов со стрельбой датчика, при этом если при повороте на 20 градусов датчик обнаруживает препятствие ultrasonic.Ranging(CM)<=8, то к числу х(по умолчанию 0) приплюсовывается 1, если не обнаруживает, то 0. Сделав замеры в одной стороне, приступить к замерам с другой стороны. Там выступает число y. с такой же логикой приращения. После окончания замеров выполнить операцию z=x-y и определить, в какую сторону повернть, по логике if z>0 то влево(например), else if z<0 то вправо, else вообще назад поехать (тупик). Но до конца код не написан, т.к. тупо не работает первая часть его. Сервопривод не работает и двигатели не останавливаются.
я честно сказать на тот кусок и не смотрел почти. оформление убивает и отбивает желание смотреть что там делается
Ну я писал, как думал. Оптимизацией еще не занимался. Начинающий. Не все еще понимаю.
В IDE есть сочетание Ctrl+T для автоматического форматирования текста.
В итге получаем:
а цикл организовать для сканирования все пространства перед платформой? значения записать в массив. затем в новом цикле обрабатываешь значения в массиве. и исходя из этого уже будешь знать где препятствие и что делать дальше
я бы так наверно сделал
Можно цикл написать, но будет ли он работать опять же, если простой по построению алгоритм не работает? Алгоритм с циклом будет тот же, хоть и разный по написанию. Я ищу ошибку в своем коде, не понимаю, почему не работает, хотя компилируется без ошибок и по логике все верно.
значит нужно по попрядку все проверять. так как по отдельности вроде проверил посмотреть либу на шилд моторов. мало ли там чего написали. обычно и либа не нужна, если конечно не через сдвиговый регистр, там чуть сложнее
Ну либа официальная, скачана с сайта Pololu конкретно для этого шилда на микросхеме DRV8835. Может она просто с библиотекой Servo не дружит.
то что официаольная ничего не значит. может по таймерам конфликт
А Вы можете посмотреть, я просто не шарю пока в библиотеках? https://github.com/pololu/drv8835-motor-shield/tree/master/DRV8835MotorShield отсюда скачивал.