Машинка на Arduino
- Войдите на сайт для отправки комментариев
Втр, 19/05/2015 - 15:17
Добрый день всем.я сразу скажу что не прошу писать код за меня,я просто прошу обьяснить кто может в коде.
задумка такая: платформа должна проверить все стороны и потом вычеслить в какую сторону должна ежать.сервопривод не должен постоянно вращаться и не тратить по просто питания.я не могу понять как правильно соединять прогрумму сервопривода потом HC SR04 и когда он сделает вычеслени и потом уже ехать в правильном направлении.
задумка по программе
включаю платформу
HC SR04 проверяет стороны
делает вычисление
выбирает нужное направление
двишаеться в выбронном направлении
// Редактируеться #include <Servo.h> #include "Ultrasonic.h" Servo myservo; // создаём объект для контроля сервы #define dead_zone 30 #define go to left 40 #define go to right 50 #define Trig A1 #define Echo A2 // sensor connected to: // Trig - 2, Echo - 3 int pos = 0; // переменная для хранения позиции сервы int IN1 = 2; // движение вперед правый движок int IN2 = 3; // движение назад левый движок int IN3 = 4; // движение назад правый движок int IN4 = 5; // движение вперед левый движок int EN1 = A0; int EN2 = 9; void setup() { myservo.attach(9); // серва подключена к 9-му пину pinMode(Trig, OUTPUT); pinMode(Echo, INPUT); pinMode (EN1, OUTPUT); pinMode (IN1, OUTPUT); pinMode (IN2, OUTPUT); pinMode (EN2, OUTPUT); pinMode (IN4, OUTPUT); pinMode (IN3, OUTPUT); } unsigned int impulseTime=0; unsigned int distance_sm=0; void loop() { for(pos = 0; pos < 180; pos += 1) // от 0 до 180 градусов { // с шагом в 1 градус myservo.write(pos); // delay(15); // ждём 15ms пока серва займёт новое положение } for(pos = 180; pos>=1; pos-=1) // от 180 до 0 градусов myservo.write(pos); delay(45); digitalWrite(Trig, HIGH); /* Подаем импульс на вход trig дальномера */ delayMicroseconds(10); // равный 10 микросекундам digitalWrite(Trig, LOW); // Отключаем impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса distance_sm=impulseTime/58; // Пересчитываем в сантиметры if (distance_sm < dead_zone) { // движение назад digitalWrite (IN1, HIGH); // движение вперед правый движок digitalWrite (IN2, LOW); // движение назад левый движок digitalWrite (IN3, HIGH); // движение назад правый движок digitalWrite (IN4, LOW); // движение вперед левый движок analogWrite(EN1, 215); analogWrite(EN2, 215); delay(20); // остановка digitalWrite (IN1, LOW); // движение вперед правый движок digitalWrite (IN2, LOW); // движение назад левый движок digitalWrite (IN3, LOW); // движение назад правый движок digitalWrite (IN4, LOW); // движение вперед левый движок analogWrite(EN1, 0); analogWrite(EN2, 0); for(pos = 0; pos < 180; pos += 1) // от 0 до 180 градусов { // с шагом в 1 градус myservo.write(pos); // delay(15); // ждём 15ms пока серва займёт новое положение } for(pos = 180; pos>=1; pos-=1) // от 180 до 0 градусов myservo.write(pos); delay(45); digitalWrite(Trig, HIGH); /* Подаем импульс на вход trig дальномера */ delayMicroseconds(10); // равный 10 микросекундам digitalWrite(Trig, LOW); // Отключаем impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса distance_sm=impulseTime/58; // Пересчитываем в сантиметры } else if (distance_sm<50) { // движение вперед digitalWrite (IN1, HIGH); digitalWrite (IN2, LOW); digitalWrite (IN3, LOW); digitalWrite (IN4, HIGH); analogWrite(EN1, 215); analogWrite(EN2, 215); } else { digitalWrite (IN1, LOW); digitalWrite (IN2, LOW); digitalWrite (IN3, LOW); digitalWrite (IN4, LOW); analogWrite(EN1, 215); analogWrite(EN2, 215); } }
Отличная тема! Вы нам простыню, а мы Вам:
Вот видео работы машинки
http://www.youtube.com/watch?v=7l6YK-FRkJc
Вот ПО:
Как видите все работает. Разбирайтесь. По писал сын -10 лет, корпус резал я.
Сыну огромное спасибо за ПО которое он написал.Да и корпус не плохо сделан. Получилось у вас очень не плохо.
мне бы не плохо было разбраться бы со своим кодом. меня сейчас больше всего интересует как программно по очереди запускать серво мотор , ультразвуковой и делать проверку местности.