Машинка+2xHC-SR04
- Войдите на сайт для отправки комментариев
Втр, 03/02/2015 - 23:27
Здравствуйте.
Сделал машину с двумя датчиками HC-SR04.
Но к сожалению при езде они не срабатывают.
Посылаю по bluetooth команду вперед, если препятствия сразу перед машинкой то машина едет назад, а если машина уже эдит то датчик как будто не видит препятствия. та же ситуация при езде назад.
int ECHO_PIN1=4; //Forvard int TRIGGER_PIN1=5; //Forvard int ECHO_PIN2=2; //Reverse int TRIGGER_PIN2=3; //Reverse int cmForward=0; int cmReverse=0; int latchPin = 13;//pin is connectedST_CP входу 74HC595 int clockPin = 12;//pin is connected SH_CP входу 74HC595 int dataPin = 14;//pin is connected DS входу 74HC595 int latchPinLED = 16;//pin is connectedST_CP входу 74HC595 int clockPinLED = 17;//pin is connected SH_CP входу 74HC595 int dataPinLED = 15;//pin is connected DS входу 74HC595 int ena_a1=9; int ena_b1=6; int ena_a2=11; int ena_b2=10; int speed=200; char direct; void setup() { Serial.begin(9600); pinMode(ECHO_PIN1, INPUT); pinMode(TRIGGER_PIN1, OUTPUT); pinMode(ECHO_PIN2, INPUT); pinMode(TRIGGER_PIN2, OUTPUT); pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(latchPinLED, OUTPUT); pinMode(clockPinLED, OUTPUT); pinMode(dataPinLED, OUTPUT); pinMode(ena_a1, OUTPUT); pinMode(ena_b1, OUTPUT); pinMode(ena_a2, OUTPUT); pinMode(ena_b2, OUTPUT); digitalWrite(TRIGGER_PIN1, LOW); digitalWrite(TRIGGER_PIN2, LOW); off_all(); } ///////////////////////measurement_distance////////////// void measurement_distance(){ digitalWrite(TRIGGER_PIN1, HIGH); delayMicroseconds(10); digitalWrite(TRIGGER_PIN1, LOW); cmForward=pulseIn(ECHO_PIN1, HIGH,20000)/58; //Serial.print("Measure_forward="); // Serial.println(cmForward); digitalWrite(TRIGGER_PIN2, HIGH); delayMicroseconds(10); digitalWrite(TRIGGER_PIN2, LOW); cmReverse=pulseIn(ECHO_PIN2, HIGH,20000)/58; // Serial.print("Measure_reverse="); // Serial.println(cmReverse); } ////////////////////////////////////////////////////////////////////// void forward(){ // blue_all(); Serial.println("FORWARD"); digitalWrite(latchPin, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPin, clockPin, MSBFIRST, 170); // передаем последовательно на dataPin digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах analogWrite(ena_a1, speed); analogWrite(ena_b1, speed); analogWrite(ena_a2, speed); analogWrite(ena_b2, speed); } void reverse(){ Serial.println("REVERSE"); digitalWrite(latchPin, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPin, clockPin, MSBFIRST, 85); // передаем последовательно на dataPin digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах // white_all(); analogWrite(ena_a1, speed); analogWrite(ena_b1, speed); analogWrite(ena_a2, speed); analogWrite(ena_b2, speed); } void right(){ Serial.println("RIGHT"); digitalWrite(latchPin, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPin, clockPin, MSBFIRST, 165); // передаем последовательно на dataPin digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах // yellow_right(); analogWrite(ena_a1, speed); analogWrite(ena_b1, speed); analogWrite(ena_a2, speed); analogWrite(ena_b2, speed); } void left(){ Serial.println("LEFT"); digitalWrite(latchPin, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPin, clockPin, MSBFIRST, 90); // передаем последовательно на dataPin digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах // yellow_left() ; analogWrite(ena_a1, speed); analogWrite(ena_b1, speed); analogWrite(ena_a2, speed); analogWrite(ena_b2, speed); } void stopp(){ Serial.println("STOP"); digitalWrite(latchPin, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPin, clockPin, MSBFIRST, 00); // передаем последовательно на dataPin digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах // red_all(); } void red_left() { digitalWrite(latchPinLED, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPinLED, clockPinLED, MSBFIRST, 254); // передаем последовательно на dataPin digitalWrite(latchPinLED, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах } void blue_left() { digitalWrite(latchPinLED, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPinLED, clockPinLED, MSBFIRST, 251); // передаем последовательно на dataPin digitalWrite(latchPinLED, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах } void green_left() { digitalWrite(latchPinLED, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPinLED, clockPinLED, MSBFIRST, 253); // передаем последовательно на dataPin digitalWrite(latchPinLED, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах } void yellow_left() { digitalWrite(latchPinLED, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPinLED, clockPinLED, MSBFIRST, 252); // передаем последовательно на dataPin digitalWrite(latchPinLED, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах } void red_right() { digitalWrite(latchPinLED, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPinLED, clockPinLED, MSBFIRST, 247); // передаем последовательно на dataPin digitalWrite(latchPinLED, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах } void blue_right() { digitalWrite(latchPinLED, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPinLED, clockPinLED, MSBFIRST, 239); // передаем последовательно на dataPin digitalWrite(latchPinLED, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах } void green_right() { digitalWrite(latchPinLED, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPinLED, clockPinLED, MSBFIRST, 223); // передаем последовательно на dataPin digitalWrite(latchPinLED, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах } void yellow_right() { digitalWrite(latchPinLED, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPinLED, clockPinLED, MSBFIRST, 215); // передаем последовательно на dataPin digitalWrite(latchPinLED, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах } void red_all() { digitalWrite(latchPinLED, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPinLED, clockPinLED, MSBFIRST, 246); // передаем последовательно на dataPin digitalWrite(latchPinLED, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах } void blue_all() { digitalWrite(latchPinLED, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPinLED, clockPinLED, MSBFIRST, 235); // передаем последовательно на dataPin digitalWrite(latchPinLED, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах } void green_all() { digitalWrite(latchPinLED, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPinLED, clockPinLED, MSBFIRST, 221); // передаем последовательно на dataPin digitalWrite(latchPinLED, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах } void yellow_all() { digitalWrite(latchPinLED, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPinLED, clockPinLED, MSBFIRST, 212); // передаем последовательно на dataPin digitalWrite(latchPinLED, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах } void white_all() { digitalWrite(latchPinLED, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPinLED, clockPinLED, MSBFIRST, 0); // передаем последовательно на dataPin digitalWrite(latchPinLED, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах } void off_all() { digitalWrite(latchPinLED, LOW);// устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPinLED, clockPinLED, MSBFIRST, 255); // передаем последовательно на dataPin digitalWrite(latchPinLED, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах } void loop() { if (Serial.available() > 0) { //если есть доступные данные считываем байт direct = Serial.read(); Serial.flush(); switch (direct) { case '1': forward(); break; case '2': reverse(); break; case '3': left(); break; case '4': right(); break; case '0': stopp(); break; case '5': stopp(); break; } } measurement_distance(); if (cmForward<100 && direct=='1'){ direct='2'; reverse(); } if (cmReverse<100 && direct=='2'){ direct='1'; forward(); } }
Ну не ужели не у кого нет идеи почему так происходит?
с 207 строки и ниже у Вас получается. Если дистанция < 100 то директ=2 и следом если дистанция < 100 и директ 2 то опять вперед.
Вы просто зациклите машинку, она будет как баран в ворота долбиться отъезжать и снова долбиться :)
Не змметил что там разные переменные
ну тогда единственное что в голову приходит это то что импульсы даете чаще чем рекомендованные 50-60мс. Когда машинка стоит даете импульс первый все проходит, а потом просто в триггер начинает сыпаться, а предыдущий цикл еще не окончен.
Поставьте после 215 строки delya(60) для интереса помотреть что будет