Это по сравнению с текущими рабочими проектами не сложно. Это просто много в ограниченных ресурсах. Тут великое счастье (или наоборот беда) что нет многопоточности. Ну и нет соблазна сильно баловаться с динамической памятью. Поэтому я в ардуинке душой отдыхаю. В ардуинке я не спец, вы правы. Меньше месяца как случайно притронулся.
Так я не про Ардуино. Это не среда разработки, не тип МК. По мне это диагноз)
Ардуино это памперсы, из которых чем быстрей вылезешь, тем лучше. К счастью я в мир МК зашёл не со стороны Ардуино.
А вот
не согласен. Это посредственные прикладные программисты сейчас в этой ситуации, когда им для условного браузера мало 1, 2,4,8 ГБ.(!!!)
В МК концепция другая. Почти противоположная: максимальный функционал, минимальные ресурсы.
Не надо опрометчиво заявлять что код для МК простой) Он по определению простым быть не может.
Да, я в похожих условиях летал свою железку в качестве бортового индикатора на северный и на южные полюса. Там, конечно, не совсем МК, но по сравнению с привычными компьютерами очень тесно и медленно. Наверное поэтому и тянет обратно к опыту молодости. Скоро из памперсов вылезу, в коробочке уже лежат голые МК, ждут выпускного из детского сада.
Давайте лучше про робота, надо ему помочь ехать. Что-то отвлеклись. Я сейчас примерно то же самое с сыном по школьному курсу информатики прохожу.
За более чем 120 сообщений он уже должен на Марсе ездить)
Все эти методы от моргания светодиодом, вывод на отладочный экранчик
до вывода на последовательный порт - незаменимые и верные инструменты. Разбалованная тушка желает отладчика с построчным выполнением и отображением переменных. В совсем тупиковых случаях логика изолируется от железа и отлаживается на большом компьютере. При необходимости пишу эмулятор железа на котором будет работать (с учетом искажений времени выполнения).
А мне кажется модульно-библиотечный подход перспективен. Голый МК интересен специалистам, а не практикам. Просто связка модуль-библиотека-язык пока не претерпели качественно нового скачка в нечто единое.
Никто не мешает заливать в голый МК прошивку, написанную в Arduino IDE ))
Специалистам? Никто.
А не специалистам кто/что мешает?
Сейчас скажут, что это для детей 8)
Если скорость, объем, потребление не критичны, ничего плохого в использовании Uno или Nano вообще не вижу. И с библиотеками.
Дальше - оптимизация. Где жмет, там и ужимаемся.
Балет.
#include <Servo.h>
Servo servo1;
int trigPin = 13; // назначаем имя для pin9
int echoPin = 12; // назначаем имя для pin8
int In2 = 2;
int In4 = 4;
int duration, cm;
int led = 6;
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT); // назначаем trigPin, как выход
pinMode(echoPin, INPUT); // назначаем echoPin, как вход
//Переведем данные пины/порты в режим вывода.
pinMode(In2, OUTPUT);
pinMode(In4, OUTPUT);
pinMode(6, OUTPUT);
servo1.attach(A0);
}
void loop() {
servo1.write(0); // ставим угол поворота под 0
delay(5000); // ждем 2 секунды
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
cm = duration / 58; // вычисляем расстояние в сантиметрах
Serial.print(cm);
Serial.println(" cm");
servo1.write(90); // ставим угол поворота под 90
delay(5000); // ждем 2 секунды
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
cm = duration / 58; // вычисляем расстояние в сантиметрах
Serial.print(cm);
Serial.println(" cm");
servo1.write(180); // ставим угол поворота под 180
delay(5000); // ждем 2 секунды
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
cm = duration / 58; // вычисляем расстояние в сантиметрах
Serial.print(cm);
Serial.println(" cm");
if (cm > 30) {
digitalWrite(In2, HIGH);
digitalWrite(In4, HIGH);
digitalWrite(6, LOW);
} if (cm < 30) {
digitalWrite(In2, LOW);
digitalWrite(In4, LOW);
digitalWrite(6, HIGH);
}
delay(1000);
}
Робот едет, крутит головой. Сервопривод подключил, светодиод добавил. Но дальномер останавливает робота только когда препятствие возникает слева от него (т.е дальномер становится прямо сначало в это время если подставить препятствие моторы не останавливаются, потом поворачивается налево в это время если поставить препятствие моторы останавливаются, затем дальномер поворачивается направо опять если подложить препятствие не реагирует).
подскажите в чем дело
???
Решение о движении или остановке принимается на основе последнего замера - а это у вас в части кода с поворотом на 180 градусов.
Вы что хотите получить от вращения сенсором? Если хотите грутить головой, но ехать вперед, то сначала крутите, а потом ставьте сенсор прямо и делайте замер для оценки движения. Если хотите понять, куда можете повернуть, то из линейного кода надо переходить к множественным условиям - искать приоритетное свободное направление и туда двигаться.
Сделайте простую задачку - для неподвижного робота вращением сенсора ищите ближайшее к прямолинейному направление где свободно от препятствий. Пока это не осилите, робота не двигайте. Как только научитесь искать свободное направление, следующим шагом будет доворот робота на тот курс и движение туда.
Я хотел что бы он также крутил головой и останавливался при обнаружении препятствия с любой стороны
а как сделать чтобы решение об остановке принималось на основе каждого замера?
Спасибо, друг. Исправил.Работает.
#include <Servo.h>
Servo servo1;
int trigPin = 13; // назначаем имя для pin9
int echoPin = 12; // назначаем имя для pin8
int In2 = 2;
int In4 = 4;
int duration, cm;
int led = 6;
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT); // назначаем trigPin, как выход
pinMode(echoPin, INPUT); // назначаем echoPin, как вход
//Переведем данные пины/порты в режим вывода.
pinMode(In2, OUTPUT);
pinMode(In4, OUTPUT);
pinMode(6, OUTPUT);
servo1.attach(A0);
}
void loop() {
if (cm > 30) {
digitalWrite(In2, HIGH);
digitalWrite(In4, HIGH);
digitalWrite(6, LOW);
}
servo1.write(0); // ставим угол поворота под 0
delay(5000); // ждем 2 секунды
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
cm = duration / 58; // вычисляем расстояние в сантиметрах
Serial.print(cm);
Serial.println(" cm");
if (cm < 30) {
digitalWrite(In2, LOW);
digitalWrite(In4, LOW);
digitalWrite(6, HIGH);
}
servo1.write(90); // ставим угол поворота под 90
delay(5000); // ждем 2 секунды
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
cm = duration / 58; // вычисляем расстояние в сантиметрах
Serial.print(cm);
Serial.println(" cm");
if (cm < 30) {
digitalWrite(In2, LOW);
digitalWrite(In4, LOW);
digitalWrite(6, HIGH);
}
servo1.write(180); // ставим угол поворота под 180
delay(5000); // ждем 2 секунды
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
cm = duration / 58; // вычисляем расстояние в сантиметрах
Serial.print(cm);
Serial.println(" cm");
if (cm < 30) {
digitalWrite(In2, LOW);
digitalWrite(In4, LOW);
digitalWrite(6, HIGH);
}
// delay(1000);
}