Cheap ultrasonic range finder works with interrupts. Fork of original https://os.mbed.com/components/HC-SR04/ and update for MbedOS6+

Dependents:   Nucleo_UltrasonicHelloWorld xxx_Sonar-HC-SR04_Lsg

Committer:
JohnnyK
Date:
Thu Jun 10 18:45:59 2021 +0000
Revision:
5:6fd0e9c7ead4
Parent:
4:e0f9c9fb4cf3
Update to MbedOS 6+

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ejteb 0:6aa04a8c8d4c 1 #include "ultrasonic.h"
ejteb 0:6aa04a8c8d4c 2
JohnnyK 5:6fd0e9c7ead4 3 ultrasonic::ultrasonic(PinName trigPin, PinName echoPin, Kernel::Clock::duration_u32 updateSpeed, Kernel::Clock::duration_u32 timeout):_trig(trigPin), _echo(echoPin)
ejteb 0:6aa04a8c8d4c 4 {
ejteb 0:6aa04a8c8d4c 5 _updateSpeed = updateSpeed;
ejteb 0:6aa04a8c8d4c 6 _timeout = timeout;
ejteb 0:6aa04a8c8d4c 7 }
ejteb 0:6aa04a8c8d4c 8
JohnnyK 5:6fd0e9c7ead4 9 ultrasonic::ultrasonic(PinName trigPin, PinName echoPin, Kernel::Clock::duration_u32 updateSpeed, Kernel::Clock::duration_u32 timeout, void onUpdate(int))
ejteb 0:6aa04a8c8d4c 10 :_trig(trigPin), _echo(echoPin)
ejteb 0:6aa04a8c8d4c 11 {
ejteb 0:6aa04a8c8d4c 12 _onUpdateMethod=onUpdate;
ejteb 0:6aa04a8c8d4c 13 _updateSpeed = updateSpeed;
ejteb 0:6aa04a8c8d4c 14 _timeout = timeout;
ejteb 0:6aa04a8c8d4c 15 _t.start ();
ejteb 0:6aa04a8c8d4c 16 }
ejteb 2:cc1143d36567 17 void ultrasonic::_startT()
ejteb 2:cc1143d36567 18 {
JohnnyK 5:6fd0e9c7ead4 19 if(chrono::duration_cast<chrono::milliseconds>(_t.elapsed_time()).count()>600)
ejteb 2:cc1143d36567 20 {
ejteb 2:cc1143d36567 21 _t.reset ();
ejteb 2:cc1143d36567 22 }
JohnnyK 5:6fd0e9c7ead4 23 start = chrono::duration_cast<chrono::microseconds>(_t.elapsed_time()).count();
ejteb 0:6aa04a8c8d4c 24 }
ejteb 0:6aa04a8c8d4c 25
ejteb 0:6aa04a8c8d4c 26 void ultrasonic::_updateDist()
ejteb 0:6aa04a8c8d4c 27 {
JohnnyK 5:6fd0e9c7ead4 28 end = chrono::duration_cast<chrono::microseconds>(_t.elapsed_time()).count();
ejteb 0:6aa04a8c8d4c 29 done = 1;
ejteb 0:6aa04a8c8d4c 30 _distance = (end - start)/6;
ejteb 0:6aa04a8c8d4c 31 _tout.detach();
JohnnyK 5:6fd0e9c7ead4 32 _tout.attach(callback(this,&ultrasonic::_startTrig), _updateSpeed);
ejteb 0:6aa04a8c8d4c 33 }
ejteb 0:6aa04a8c8d4c 34 void ultrasonic::_startTrig(void)
ejteb 0:6aa04a8c8d4c 35 {
ejteb 0:6aa04a8c8d4c 36 _tout.detach();
ejteb 0:6aa04a8c8d4c 37 _trig=1;
ejteb 0:6aa04a8c8d4c 38 wait_us(10);
ejteb 0:6aa04a8c8d4c 39 done = 0;
JohnnyK 5:6fd0e9c7ead4 40 _echo.rise(callback(this,&ultrasonic::_startT));
JohnnyK 5:6fd0e9c7ead4 41 _echo.fall(callback(this,&ultrasonic::_updateDist));
ejteb 0:6aa04a8c8d4c 42 _echo.enable_irq ();
JohnnyK 5:6fd0e9c7ead4 43 _tout.attach(callback(this,&ultrasonic::_startTrig),_timeout);
ejteb 2:cc1143d36567 44 _trig=0;
ejteb 0:6aa04a8c8d4c 45 }
ejteb 0:6aa04a8c8d4c 46
ejteb 0:6aa04a8c8d4c 47 int ultrasonic::getCurrentDistance(void)
ejteb 0:6aa04a8c8d4c 48 {
ejteb 0:6aa04a8c8d4c 49 return _distance;
ejteb 0:6aa04a8c8d4c 50 }
ejteb 0:6aa04a8c8d4c 51 void ultrasonic::pauseUpdates(void)
ejteb 0:6aa04a8c8d4c 52 {
ejteb 0:6aa04a8c8d4c 53 _tout.detach();
ejteb 0:6aa04a8c8d4c 54 _echo.rise(NULL);
ejteb 0:6aa04a8c8d4c 55 _echo.fall(NULL);
ejteb 0:6aa04a8c8d4c 56 }
ejteb 0:6aa04a8c8d4c 57 void ultrasonic::startUpdates(void)
ejteb 0:6aa04a8c8d4c 58 {
ejteb 0:6aa04a8c8d4c 59 _startTrig();
ejteb 0:6aa04a8c8d4c 60 }
ejteb 0:6aa04a8c8d4c 61 void ultrasonic::attachOnUpdate(void method(int))
ejteb 0:6aa04a8c8d4c 62 {
ejteb 0:6aa04a8c8d4c 63 _onUpdateMethod = method;
ejteb 0:6aa04a8c8d4c 64 }
JohnnyK 5:6fd0e9c7ead4 65 void ultrasonic::changeUpdateSpeed(Kernel::Clock::duration_u32 updateSpeed)
ejteb 0:6aa04a8c8d4c 66 {
ejteb 0:6aa04a8c8d4c 67 _updateSpeed = updateSpeed;
ejteb 0:6aa04a8c8d4c 68 }
ejteb 0:6aa04a8c8d4c 69 int ultrasonic::isUpdated(void)
ejteb 0:6aa04a8c8d4c 70 {
ejteb 4:e0f9c9fb4cf3 71 //printf("%d", done);
ejteb 0:6aa04a8c8d4c 72 d=done;
ejteb 0:6aa04a8c8d4c 73 done = 0;
ejteb 0:6aa04a8c8d4c 74 return d;
ejteb 0:6aa04a8c8d4c 75 }
ejteb 2:cc1143d36567 76 void ultrasonic::checkDistance(void)
ejteb 2:cc1143d36567 77 {
ejteb 2:cc1143d36567 78 if(isUpdated())
ejteb 2:cc1143d36567 79 {
ejteb 2:cc1143d36567 80 (*_onUpdateMethod)(_distance);
ejteb 2:cc1143d36567 81 }
ejteb 2:cc1143d36567 82 }