It's a new iARoC (International Autonomous Robot Competition) year (2016)
and we are back to the ultrasonic sensor problem. This year I am using the
4-pin version. The following code works:
public void readRight() throws ConnectionLostException, InterruptedException
{//This code works with the 4-pin sensor...don't change anything!
rightStrobe.write(true);
SystemClock.*sleep*(10);
rightStrobe.write(false);
rightDistance = (int) (rightInput.getDuration() * *CONVERSION_FACTOR*);
}
But it will not work with less than a 10 ms long trigger pulse. I don't
understand this, because the ultrasonic sensor spec says that the trigger
pulse should be around 10 micro sec. Do you have any idea why I need such
a long trigger pulse. I verified the waveforms with a scope. It seems to
be the case with both the 4-pin and the 3-pin version.
On Thursday, April 23, 2015 at 9:43:50 PM UTC-7, Ytai wrote:
>
> You can add a TimerTask to interrupt the thread after some timeout. Search
> the forum for examples if you need them. If you don't want to delay all the
> other 5 if one is stuck you can easily run 6 sensors on 6 different threads.
>
> On Wed, Apr 22, 2015 at 2:42 PM, Daniel Brown <[email protected]
> <javascript:>> wrote:
>
>> if one PulseInput pin is open or has not received a pulse and you call
>> getDuration() it will block you from reading all other PulseInput pins
>> until it has received at least one pulse. We have found that one bad sensor
>> will stop you from reading any other sensor.
>>
>>
>> On Friday, April 10, 2015 at 6:59:52 PM UTC-6, Daniel Brown wrote:
>>>
>>> We have a project that uses 6 distance finders, when we try to call
>>> .getDuration() on more then one all further reading freezes.
>>>
>>> protected void setup() throws ConnectionLostException {
>>>
>>> // front left pulse and echo
>>> echoPinfl_ = ioio_.openPulseInput(6, PulseMode.POSITIVE);
>>> triggerPinfl_ = ioio_.openDigitalOutput(7);
>>> // front middle pulse and echo
>>> echoPinfm_ = ioio_.openPulseInput(2, PulseMode.POSITIVE);
>>> triggerPinfm_ = ioio_.openDigitalOutput(4);
>>>
>>> ...
>>>
>>> public void loop() throws ConnectionLostException, InterruptedException {
>>> // updates front left sensor
>>> try{
>>> triggerPinfl_.write(false);
>>> Thread.sleep(5);
>>> triggerPinfl_.write(true);
>>> Thread.sleep(1);
>>> triggerPinfl_.write(false);
>>> echosecondsfl_ = (int)(echoPinfl_.getDuration() * 1000 * 1000);
>>> echoDistanceCmfl_ = echosecondsfl_ / 29 / 2;
>>> }catch (ConnectionLostException e) { throw e;}
>>> // updates front middle sensor
>>> try{
>>> triggerPinfm_.write(false);
>>> Thread.sleep(5);
>>> triggerPinfm_.write(true);
>>> Thread.sleep(1);
>>> triggerPinfm_.write(false);
>>> // echosecondsfm_ = (int)(echoPinfm_.getDuration() * 1000 * 1000);
>>> //if this line is commented in all further input stops
>>> // echoDistanceCmfm_ = echosecondsfm_ / 29 / 2;
>>> }catch (ConnectionLostException e) { throw e;}
>>>
>>> ...
>>>
>>> On Friday, May 16, 2014 at 11:03:20 AM UTC-6, Ytai wrote:
>>>>
>>>> Thanks for sharing!
>>>>
>>>>
>>>> On Thu, May 15, 2014 at 9:25 PM, <[email protected]> wrote:
>>>>
>>>>> Here is some code that works great with the Parallax Ping))) with the
>>>>> circuit in the file attached (thanks to Ytai):
>>>>>
>>>>> private int read(DigitalOutput strobe, PulseInput input, int inputPin)
>>>>> throws ConnectionLostException, InterruptedException // Order of
>>>>> following statements is very important...do not change
>>>>>
>>>>> {
>>>>> int distance = 0;
>>>>>
>>>>> ioio.beginBatch();
>>>>>
>>>>>
>>>>> strobe.write(true);
>>>>>
>>>>> input = ioio.openPulseInput(inputPin, PulseMode.POSITIVE);
>>>>>
>>>>> ioio.endBatch();
>>>>>
>>>>>
>>>>> SystemClock.sleep(40);
>>>>>
>>>>> strobe.write(false);
>>>>>
>>>>> distance += (int) (input.getDuration() * CONVERSION_FACTOR);
>>>>>
>>>>> input.close();
>>>>>
>>>>>
>>>>> return distance;
>>>>> }
>>>>>
>>>>>
>>>>> On Wednesday, April 30, 2014 10:25:27 AM UTC-7, [email protected]
>>>>> wrote:
>>>>>>
>>>>>> I'll clean up the class and post it. Hope other people can use it.
>>>>>> Works very solidly with the Parallax Ping))) ultrasonic module.
>>>>>> Great suggestion to use only one pin for both input and output. It
>>>>>> would even have saved me a part on the pc boards.
>>>>>>
>>>>>> On Sunday, April 27, 2014 8:24:19 PM UTC-7, Ytai wrote:
>>>>>>>
>>>>>>> Cool. If you can create a nice class for using the PING (where the
>>>>>>> ctor gets a IOIO and two pin numbers, and there's a getDistance()
>>>>>>> method)
>>>>>>> and share it on this forum, it would be a decent return for our efforts
>>>>>>> :)
>>>>>>> As a side note, since you're doing the open-close trick, you might as
>>>>>>> well
>>>>>>> use a single pin and open-close the digital output as well and not need
>>>>>>> the
>>>>>>> driver chip, so you can even further simplify both your code and your
>>>>>>> circuit.
>>>>>>>
>>>>>>>
>>>>>>> On Sun, Apr 27, 2014 at 8:19 PM, Vic Wintriss <[email protected]>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> I finally got it to work using your last suggestion. This code
>>>>>>>> works that you recommended works perfectly. Thanks so much for
>>>>>>>> sticking
>>>>>>>> with us. We've got 30 or 40 kids using this code at the International
>>>>>>>> Autonomous Robot Competition (iARoC 2014) coming up at the end of
>>>>>>>> June.
>>>>>>>> Check out iaroc.org.
>>>>>>>>
>>>>>>>> triggerHigh();
>>>>>>>> in = openPulseInput();
>>>>>>>> sleep(20ms); // wait until the pulse input module is ready for a
>>>>>>>> pulse.
>>>>>>>> triggerLow(); // kick off a measurement (falling edge does not
>>>>>>>> trigger the pulse input)
>>>>>>>> duration = in.getDuration();
>>>>>>>> in.close();
>>>>>>>> return duration;
>>>>>>>>
>>>>>>>> On Sunday, April 27, 2014 11:36:53 AM UTC-7, Ytai wrote:
>>>>>>>>
>>>>>>>>> Let me shed some light on the internals of PulseInput:
>>>>>>>>>
>>>>>>>>> - A timer is running on the IOIO set to 200Hz (5ms).
>>>>>>>>> - As soon as the pulse input module is opened, and every time
>>>>>>>>> after a pulse is captured the module will be put in the "ready"
>>>>>>>>> state.
>>>>>>>>> - Every time the 200Hz timer triggers, each "ready" module
>>>>>>>>> will be activated, i.e. put in a state where it is waiting for a
>>>>>>>>> new pulse.
>>>>>>>>> - Once activated, the module will wait forever (or until
>>>>>>>>> closed) for a pulse, then measure its duration, then sends the
>>>>>>>>> result to
>>>>>>>>> the Android.
>>>>>>>>> - So this means that effectively no matter what the actual
>>>>>>>>> pulse rate is, you will never get more than 200 reports per
>>>>>>>>> second. This
>>>>>>>>> has been done on purpose to prevent a high frequency pulse train
>>>>>>>>> from
>>>>>>>>> saturating the connection between the IOIO and the Android. This
>>>>>>>>> also means
>>>>>>>>> that there is a potential "dead time" of up to 5ms after opening
>>>>>>>>> or between
>>>>>>>>> pulses, during which a pulse would not be detected.
>>>>>>>>> - On the Android side, every pulse report finds its way to
>>>>>>>>> your PulseInput object. You can then read it in one of three ways:
>>>>>>>>> - getDuration() will return the last report. It will
>>>>>>>>> generally not block, then only exception is until the first
>>>>>>>>> report arrives.
>>>>>>>>> - getDurationSync() will always block until a new report
>>>>>>>>> comes in, then return it. So you can be sure that the report is
>>>>>>>>> new.
>>>>>>>>> - getDurationBuffered() pulls pulses one by one from a
>>>>>>>>> queue. When the queue becomes empty it behave like
>>>>>>>>> getDurationSync(), i.e.
>>>>>>>>> waits until a new report comes in.
>>>>>>>>>
>>>>>>>>> The Arduino approach cannot be directly applied to the IOIO API,
>>>>>>>>> since you have to take into account that because of the communication
>>>>>>>>> between the Android and the IOIO, much of the IOIO API has been
>>>>>>>>> designed to
>>>>>>>>> be asynchronous in nature. If you were to bake the PING driver
>>>>>>>>> directly
>>>>>>>>> into the IOIO firmware, you can use a similar approach to Arduino's
>>>>>>>>> (although you'd probably want to implement it in a non-blocking way,
>>>>>>>>> since
>>>>>>>>> the IOIO allows everything to be used concurrently). The reason why I
>>>>>>>>> have
>>>>>>>>> not done that is because I tried to focus on generic use-cases rather
>>>>>>>>> than
>>>>>>>>> on one peculiar sensor interface.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Sun, Apr 27, 2014 at 10:57 AM, Duane DeSieno <
>>>>>>>>> [email protected]> wrote:
>>>>>>>>>
>>>>>>>>>> My confusion is maybe over the way getDuration works.
>>>>>>>>>> Does it delay 5ms before looking for the pulse or does it look
>>>>>>>>>> immediately?
>>>>>>>>>> I put 555 timer on the input pin and set it up for 3.15hz and
>>>>>>>>>> 25.4% duty cycle or an 80.6ms pulse every 317.4ms.
>>>>>>>>>> I called getDuration roughly every 100ms. It did not block and
>>>>>>>>>> returned the same value several times before the next pulse
>>>>>>>>>> occurred(not
>>>>>>>>>> what I expected).
>>>>>>>>>>
>>>>>>>>>> Looked at the Arduino approach to using the PING and they use
>>>>>>>>>> just one pin, changing from output after sending a pulse to ping to
>>>>>>>>>> an
>>>>>>>>>> input for their get duration call.
>>>>>>>>>> Since they don't impose a 5ms delay, they get the duration of the
>>>>>>>>>> return pulse.
>>>>>>>>>>
>>>>>>>>>> Thanks for you help on this.
>>>>>>>>>>
>>>>>>>>>> Duane
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> You received this message because you are subscribed to the
>>>>>>>>>> Google Groups "ioio-users" group.
>>>>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>>>>> send an email to [email protected].
>>>>>>>>>> To post to this group, send email to [email protected].
>>>>>>>>>>
>>>>>>>>>> Visit this group at http://groups.google.com/group/ioio-users.
>>>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>> You received this message because you are subscribed to the Google
>>>>>>>> Groups "ioio-users" group.
>>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>>> send an email to [email protected].
>>>>>>>> To post to this group, send email to [email protected].
>>>>>>>> Visit this group at http://groups.google.com/group/ioio-users.
>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>
>>>>>>>
>>>>>>> --
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "ioio-users" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>>> an email to [email protected].
>>>>> To post to this group, send email to [email protected].
>>>>> Visit this group at http://groups.google.com/group/ioio-users.
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>>
>>>> --
>> You received this message because you are subscribed to the Google Groups
>> "ioio-users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected]
>> <javascript:>.
>> Visit this group at http://groups.google.com/group/ioio-users.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
--
You received this message because you are subscribed to the Google Groups
"ioio-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/ioio-users.
For more options, visit https://groups.google.com/d/optout.