Use PWM output to generate periodic, precisely timed trigger pulses. On Apr 12, 2016 10:36, "Vic Wintriss" <[email protected]> wrote:
> I thought I was following your instructions. I am using the 4-pin sensor > as suggested and code that I thought was standard. What did you tell me to > do that I am not doing? > > On Monday, April 11, 2016 at 1:28:48 PM UTC-7, Ytai wrote: >> >> I feel like I gave you my best advice, but you seem to insist on doing it >> in a way that's not supposed to work. >> On Apr 11, 2016 1:03 PM, "Vic Wintriss" <[email protected]> wrote: >> >>> When I use this code: >>> >>> ioio.beginBatch(); >>> rightStrobe.write(true); >>> rightStrobe.write(false); >>> ioio.endBatch(); >>> >>> I get this beautiful result: >>> >>> >>> <https://lh3.googleusercontent.com/-qyhO2zqtmoY/VwwBnL2vE7I/AAAAAAAAAAg/xyOLBnQBnuIvFhdp0IdprRb_qVvx6Hckw/s1600/bad.PNG> >>> >>> But the code hangs up and I get no duration readings. >>> >>> If I use this code: >>> >>> rightStrobe.write(true); >>> SystemClock.sleep(10); >>> rightStrobe.write(false); >>> >>> rightDistance = (int) (rightInput.getDuration() * CONVERSION_FACTOR); >>> I get this awful situation, but it works. Anything less than a 10 >>> millisec sleep fails. >>> >>> >>> <https://lh3.googleusercontent.com/-WEm_XYa5PF8/VwwBBYuVQ9I/AAAAAAAAAAY/15jv4SAWC3ouxIcAW9EyO7GC-SEZgtSZA/s1600/works.png> >>> >>> On Monday, April 4, 2016 at 9:25:36 PM UTC-7, Ytai wrote: >>>> >>>> Sorry, I meant "output" from the IOIO's point of view. >>>> Let me make sure I understand you correctly: are you claiming that >>>> you're emitting a shorter-than-10-ms trigger pulse, the pulse gets emitted >>>> correctly as verified by a scope, the echo pulse gets emitted correctly as >>>> verified by a scope, but your app is blocked on waitPulseGetDuration()? If >>>> that's the case, the only thing I can imagine is that the wait*() method is >>>> called after the pulse has already comes back. >>>> >>>> Have you considered using PwmOutput as trigger, as per my suggestion? >>>> Then you can use getDuration() and never have to block. I think this is a >>>> rather elegant solution. >>>> >>>> On Mon, Apr 4, 2016 at 10:51 AM, <[email protected]> wrote: >>>> >>>>> The output pulse (echo pulse returning from the ultrasonic sensor) is >>>>> correct...it is milli secs long and varies proportionately with the >>>>> distance. I am not using Bluetooth...the Android is directly connected to >>>>> the ioio board. It is the trigger pulse that must be long...more than 10 >>>>> millisec...for the program to run. It hangs up with smaller trigger >>>>> pulses. I can easily generate 10 microsec trigger pulses...as observed on >>>>> scope...but then the program hangs up. Ideas? >>>>> >>>>> On Friday, April 1, 2016 at 9:55:17 PM UTC-7, Ytai wrote: >>>>>> >>>>>> When you look at the waveforms, what do you see as the output pulse? >>>>>> My guess would be that it is very narrow, in the order of a couple of >>>>>> usec >>>>>> perhaps, and if that's indeed the case, it is likely because both >>>>>> messages >>>>>> comprising the pulse got collapsed into the same packet over one of the >>>>>> slower connections such as Bluetooth. In short, trying to achieve precise >>>>>> timing of any sort at this time scale is a bad idea. It would be possible >>>>>> to add a one-shot feature to the IOIO to achieve that. If you want this >>>>>> reading periodically, consider using a PwmOutput to keep triggering the >>>>>> sensor without your intervention at very precise pulse widths and period. >>>>>> Another option would be to use a version of those sensors that emits an >>>>>> analog voltage corresponding to the distance. >>>>>> On Apr 1, 2016 9:38 PM, <[email protected]> wrote: >>>>>> >>>>>>> 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]> >>>>>>>> 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]. >>>>>>>>> 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 https://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. >>>>> >>>> >>>> -- >>> 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. >>> >> -- > 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. > -- 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.
