Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Нужна помощь подключение HC-SR04(датчик расстояния)

Тема в разделе "Железные вопросы по esp8266", создана пользователем zukum, 24 апр 2015.

  1. zukum

    zukum Читатель

    Сообщения:
    17
    Симпатии:
    5
    Доброго времени суток!
    Подключал ли кто-то HC-SR04 к esp8266. Мои попытки успехом не увенчались. Пытался подключить выводы Trig и Echo от HC-SR04 к GPIO0 и GPIO2 соответственно. На питании 3.3v запрос дистанции (использовал код из библиотеки Ultrasonic из Arduino) возвращает ноль. Попытка подключить питание на сонар 5в, приводит к тому что не стартует esp8266 (синий светодиод на плате не загорается, т.е. вебсервер не стартует).

    Может кто подскажет что не так делаю.

    Вот код написанный под среду разработки Arduino(переделал пример из статьи с этого сайта):
    Код (C):
    1. #include <ESP8266WiFi.h>
    2.  
    3. // Trig - 0, Echo - 2
    4. // Ultrasonic ultrasonic(0, 2);
    5. float dist_cm = 0;
    6. #define Trig_pin 0
    7. #define Echo_pin 2
    8. long  duration,distacne_cm,distance_inc;
    9. #define CM 1
    10. #define INC 0
    11.  
    12. const char* ssid = "Net341";
    13. const char* password = "A3F28F89DB";
    14.  
    15. // Create an instance of the server
    16. // specify the port to listen on as an argument
    17. WiFiServer server(80);
    18.  
    19. long Timing()
    20. {
    21.   digitalWrite(Trig_pin, LOW);
    22.   delayMicroseconds(2);
    23.   digitalWrite(Trig_pin, HIGH);
    24.   delayMicroseconds(10);
    25.   digitalWrite(Trig_pin, LOW);
    26.   duration = pulseIn(Echo_pin, HIGH);
    27.   return duration;
    28. }
    29.  
    30. long Ranging(int sys)
    31. {
    32.   Timing();
    33.   distacne_cm = duration /29 / 2 ;
    34.   distance_inc = duration / 74 / 2;
    35.   if (sys)
    36.     return distacne_cm;
    37.   else
    38.     return distance_inc;
    39. }
    40.  
    41. void setup() {
    42.   Serial.begin(115200);
    43.   delay(10);
    44. // инициализация пинов для ультрасоника
    45.    pinMode(Trig_pin, OUTPUT);
    46.    pinMode(Echo_pin, INPUT);
    47.  
    48.  
    49.   // prepare GPIO2
    50. //  pinMode(2, OUTPUT);
    51. //  digitalWrite(2, 0);
    52.  
    53.   // Connect to WiFi network
    54.   Serial.println();
    55.   Serial.println();
    56.   Serial.print("Connecting to ");
    57.   Serial.println(ssid);
    58.  
    59.   WiFi.begin(ssid, password);
    60.  
    61.   while (WiFi.status() != WL_CONNECTED) {
    62.     delay(500);
    63.     Serial.print(".");
    64.   }
    65.   Serial.println("");
    66.   Serial.println("WiFi connected");
    67.  
    68.   // Start the server
    69.   server.begin();
    70.   Serial.println("Server started");
    71.  
    72.   // Print the IP address
    73.   Serial.println(WiFi.localIP());
    74. }
    75.  
    76. void loop() {
    77.   // Check if a client has connected
    78.   WiFiClient client = server.available();
    79.   if (!client) {
    80.     return;
    81.   }
    82.  
    83.   // Wait until the client sends some data
    84.   Serial.println("new client");
    85.   while(!client.available()){
    86.     delay(1);
    87.   }
    88.  
    89.   // Read the first line of the request
    90.   String req = client.readStringUntil('\r');
    91.   Serial.println(req);
    92.   client.flush();
    93.  
    94.   dist_cm = Ranging(CM);     // get distance
    95.   Serial.print(";dist=");
    96.   Serial.println(dist_cm);
    97.  
    98.  
    99.   client.flush();
    100.  
    101.   // Prepare the response
    102.   String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now ";
    103.   //s += (dist_cm)?"high":"low";
    104.   s += dist_cm;
    105.   s += "</html>\n";
    106.  
    107.   // Send the response to the client
    108.   client.print(s);
    109.   delay(1);
    110.   Serial.println("Client disonnected");
    111.  
    112.   // The client will actually be disconnected
    113.   // when the function returns and 'client' object is detroyed
    114. }
     
  2. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
  3. zukum

    zukum Читатель

    Сообщения:
    17
    Симпатии:
    5
    Спасибо за ответ!
    К сожалению код для Eclipse если не ошибаюсь, как есть его использовать нет возможности.
    В приведенном примере используется пин5, у меня плана ESP-01, на ней вывод RX, TX, GPIO0, GPIO2.
    В своем примере я использовал GPIO0 и 2. В остальном код вроде не различается. Логика простая.
    Вычитал на форуме что при старте esp8266 необходимо чтобы выводы GPIO 0 и 2 были подтянуты к плюсу. Сделал так - запитал HC-SR04 от 5v, выводы Echo и Trig подключаю после старта esp8266, при этом сервер на esp8266 работает нормально, но дистанцию все равно не зачитывает.

    МОжет есть какая-то особенность работы с GPIO по сравнению с работой с пинами Arduino. На ардуино датчик прекрасно работает.
     
  4. AnonymUser

    AnonymUser Новичок

    Сообщения:
    27
    Симпатии:
    2
    моожно собрать через командную строку командой make , если win поставьте с этого поста http://esp8266.ru/forum/threads/smi...abotki-proshivok-esp8266.167/page-4#post-4333
    или соберите сами https://github.com/anakod/Sming/releases

    расчет проверяли?
    на сигнальный пин сигнал идет(отключите от датчика и проверьте)? А ответ от датчика к esp? попробуйте просто вывод данных без расчетов.


    upd:

    [HASHTAG]#define[/HASHTAG] Trig_pin 0
    pinMode(Trig_pin, OUTPUT);

    согласно таблице http://esp8266.ru/wp-content/uploads/esp8266-gpio.jpg gpio 0 не работает на output
     
    Последнее редактирование: 24 апр 2015
  5. zukum

    zukum Читатель

    Сообщения:
    17
    Симпатии:
    5
    Вот где собака порылась. Оба используемых мною пина не работают на out. Спасибо за ценный совет. Буду думать что делать, пинов в исполнении esp01 не так много
     
  6. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    Это какая-то странная таблица, у меня прекрасно I2C заводится на GPIO0,2
    Единственное условие при загрузки модуля они должны быть в правильном состоянии.

    PS Кстати UART пины тоже вполне можно использовать как GPIO
     
  7. AnonymUser

    AnonymUser Новичок

    Сообщения:
    27
    Симпатии:
    2
    ну тогда я даже не знаю что она здесь делает http://esp8266.ru/esp8266-gpio-registers/ )

    http://esp8266.ru/esp8266-esp-01-hacked/
     
  8. sharky

    sharky Читатель

    Сообщения:
    32
    Симпатии:
    12
    А уровни согласовать не забыли?
    Там в каментах к либе сминговой я писал про согласование.

    Hsr04 пятивольтовый а эха должна приходить трехвольтовая, иначе не взлетит.
     
    JustACat нравится это.
  9. Victor

    Victor Administrator Команда форума

    Сообщения:
    2.211
    Симпатии:
    386
    JustACat и AnonymUser нравится это.
  10. zukum

    zukum Читатель

    Сообщения:
    17
    Симпатии:
    5
    GPIO0 и GPIO2 работают на OUTPUT и на INPUT, доказано на опыте.
    Но то-ли лыжи не едут то-ли еще чего, но не считывается расстояние.
    Итак выяснилось что ESP посылает сигнал в сонар, и сонар отвечает - ардуина считывает сигнал ответа, так что здесь сомнений нет. Согласование выводов сделал( LM1117DT-3.3), по крайней мере при подачи 5v через согласователь на GPIO2 который настроен на INPUT показывает 1 на входе. Может функция PulseIn как-то криво работает...
     
    Последнее редактирование: 26 апр 2015
  11. zukum

    zukum Читатель

    Сообщения:
    17
    Симпатии:
    5
    Еще один ньюанс, если при старте ESP к нему подключен сонар(HC-SR04) - GPIO0 на Trig и GPIO2 на Echo, при этом сонар запитан от 5v, на ESP загорается синий светодиод и он не отвечает, если наоборот подключить - ESP переходит в режим прошивки. Как это можно победить?
     
  12. zukum

    zukum Читатель

    Сообщения:
    17
    Симпатии:
    5
    Победил проблему! Ура!
    На GPIO2 так и не удалось подключить Echo от ултрасоника. Пришлось применить грязный хак из http://esp8266.ru/esp8266-esp-01-hacked/. Вывел GPIO14, подключил к нему Echo. Модуль стал стартовать без проблем но дистанцию не показывал. Выяснилось что PulseIn для esp не работает, написал свою, все заработало.
    Всем спасибо за помощь!
     
    JustACat нравится это.
  13. zukum

    zukum Читатель

    Сообщения:
    17
    Симпатии:
    5
    Картинка, если кому интересно я использую для макетирования IDE шлейф, удобно. Но надо учитывать что часть пинов соединены между собой. Опытным путем проверяется
    esp.jpg
     
    Последнее редактирование модератором: 29 апр 2015
  14. JustACat

    JustACat Moderator Команда форума

    Сообщения:
    568
    Симпатии:
    121
    Если не секрет, поделитесь наработками по PulseIn (пожалуйста в Код и под Спойлер). Спасибо!
     
  15. zukum

    zukum Читатель

    Сообщения:
    17
    Симпатии:
    5
    Конечно поделюсь:
    Код (C):
    1. unsigned long Mypulsein(int pin, int level)
    2. {
    3.   int i = 0;
    4.   unsigned long start, startImp, finishImp;
    5.   start =  millis();
    6.   startImp =  micros();
    7.   finishImp =  micros();
    8.   do {
    9.     if (digitalRead(pin)==level){
    10.       i = 1;
    11.       startImp =  micros();
    12.     }
    13.   } while((i==0)&&((millis()-start)<500));
    14.   i = 0;
    15.   do {
    16.     if (digitalRead(pin)!=level){
    17.       i = 1;
    18.       finishImp =  micros();
    19.     }
    20.   } while((i==0)&&((millis()-start)<1000));
    21.  
    22.   return finishImp - startImp;
    23. }
     
    Alexey N, Victor и JustACat нравится это.

Поделиться этой страницей