Робот должен ехать туда обратно и при появлении препятствия перед дальномеро останавливаться

Это по сравнению с текущими рабочими проектами не сложно. Это просто много в ограниченных ресурсах. Тут великое счастье (или наоборот беда) что нет многопоточности. Ну и нет соблазна сильно баловаться с динамической памятью. Поэтому я в ардуинке душой отдыхаю. В ардуинке я не спец, вы правы. Меньше месяца как случайно притронулся.

Так я не про Ардуино. Это не среда разработки, не тип МК. По мне это диагноз)
Ардуино это памперсы, из которых чем быстрей вылезешь, тем лучше. К счастью я в мир МК зашёл не со стороны Ардуино.
А вот

не согласен. Это посредственные прикладные программисты сейчас в этой ситуации, когда им для условного браузера мало 1, 2,4,8 ГБ.(!!!)
В МК концепция другая. Почти противоположная: максимальный функционал, минимальные ресурсы.
Не надо опрометчиво заявлять что код для МК простой) Он по определению простым быть не может.

Да, я в похожих условиях летал свою железку в качестве бортового индикатора на северный и на южные полюса. Там, конечно, не совсем МК, но по сравнению с привычными компьютерами очень тесно и медленно. Наверное поэтому и тянет обратно к опыту молодости. Скоро из памперсов вылезу, в коробочке уже лежат голые МК, ждут выпускного из детского сада.

Давайте лучше про робота, надо ему помочь ехать. Что-то отвлеклись. Я сейчас примерно то же самое с сыном по школьному курсу информатики прохожу.

За более чем 120 сообщений он уже должен на Марсе ездить)

1 лайк

Ты не поверишь, иногда отлаживать можно даже с помощью всего одного светодиода.

3 лайка

Все эти методы от моргания светодиодом, вывод на отладочный экранчик
до вывода на последовательный порт - незаменимые и верные инструменты. Разбалованная тушка желает отладчика с построчным выполнением и отображением переменных. В совсем тупиковых случаях логика изолируется от железа и отлаживается на большом компьютере. При необходимости пишу эмулятор железа на котором будет работать (с учетом искажений времени выполнения).

А мне кажется модульно-библиотечный подход перспективен. Голый МК интересен специалистам, а не практикам. Просто связка модуль-библиотека-язык пока не претерпели качественно нового скачка в нечто единое.

Никто не мешает заливать в голый МК прошивку, написанную в Arduino IDE ))

1 лайк

Специалистам? Никто.

А не специалистам кто/что мешает? :grinning:

Сейчас скажут, что это для детей 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);
}