OK…thanks…I’ll try it. > On Apr 12, 2016, at 3:09 PM, Ytai Ben-Tsvi <[email protected]> wrote: > > Because there's no guarantee hour long it would take between when your > command executed on the Android and when the actual pin voltage changes. What > you're seeing when having a short (or no) delay between the commands is that > sometimes they would end up actually getting executed a very short gap > between them. > Coming to think of it, if you only care about minimum duration, you can add a > ioio.sync() call after starting the pulse and before starting the delay. This > will guarantee that the delay begins after the pin has already been set. This > will allow you to set a 1ms sleep without the pulse collapsing, but no > guarantees on maximum width, it may come out wider than 1ms. > > On Apr 12, 2016 3:02 PM, "Vic Wintriss" <[email protected] > <mailto:[email protected]>> wrote: > Ytai: > > Why can’t I use: > > strobe.write(true); > strobe.write(false); > input.getDuration(); > > Vic > > >> On Apr 12, 2016, at 2:57 PM, Ytai Ben-Tsvi <[email protected] >> <mailto:[email protected]>> wrote: >> >> Good question. Currently the only way to ensure this level of sync is the >> motion control API. Alternatively, if your time constants are coarse enough, >> you can open multiple PWM channels running at slow rates and insert delays >> between the open command (order of 10's of ms as you have seen with your >> experiments). The ideal solution would have been a one-shot function, which >> is easy to implement using an output compare module, but this doesn't >> currently exist. >> >> On Apr 12, 2016 11:07, "Vic Wintriss" <[email protected] >> <mailto:[email protected]>> wrote: >> How would you work the PWM with multiple sensors? >> >> On Tuesday, April 12, 2016 at 10:54:34 AM UTC-7, Ytai wrote: >> No threads involved and nothing asynchronous. You set the PWM once during >> setup(), then you getDuration() whenever you please. >> >> On Apr 12, 2016 10:52 AM, "Vic Wintriss" <[email protected] <>> wrote: >> I would rather run the ultrasonics asynchronously. Also since the kids may >> not be be that advanced in our curriculum I prefer to stay away from >> threads. The last code that I posted works fine. >> >> On Tuesday, April 12, 2016 at 10:37:52 AM UTC-7, Ytai wrote: >> 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 <http://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 >> <http://groups.google.com/group/ioio-users>. >> For more options, visit https://groups.google.com/d/optout >> <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 >> <http://groups.google.com/group/ioio-users>. >> For more options, visit https://groups.google.com/d/optout >> <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 >> <http://groups.google.com/group/ioio-users>. >> For more options, visit https://groups.google.com/d/optout >> <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 >> <http://groups.google.com/group/ioio-users>. >> For more options, visit https://groups.google.com/d/optout >> <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 >> <https://groups.google.com/group/ioio-users>. >> For more options, visit https://groups.google.com/d/optout >> <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 >> <https://groups.google.com/group/ioio-users>. >> For more options, visit https://groups.google.com/d/optout >> <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 >> <https://groups.google.com/group/ioio-users>. >> For more options, visit https://groups.google.com/d/optout >> <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 >> <https://groups.google.com/group/ioio-users>. >> For more options, visit https://groups.google.com/d/optout >> <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 >> <https://groups.google.com/group/ioio-users>. >> For more options, visit https://groups.google.com/d/optout >> <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] >> <mailto:[email protected]>. >> To post to this group, send email to [email protected] >> <mailto:[email protected]>. >> Visit this group at https://groups.google.com/group/ioio-users >> <https://groups.google.com/group/ioio-users>. >> For more options, visit https://groups.google.com/d/optout >> <https://groups.google.com/d/optout>. >> >> -- >> You received this message because you are subscribed to a topic in the >> Google Groups "ioio-users" group. >> To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/ioio-users/3MDLEEKtejY/unsubscribe >> <https://groups.google.com/d/topic/ioio-users/3MDLEEKtejY/unsubscribe>. >> To unsubscribe from this group and all its topics, send an email to >> [email protected] >> <mailto:[email protected]>. >> >> To post to this group, send email to [email protected] >> <mailto:[email protected]>. >> Visit this group at https://groups.google.com/group/ioio-users >> <https://groups.google.com/group/ioio-users>. >> For more options, visit https://groups.google.com/d/optout >> <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] > <mailto:[email protected]>. > To post to this group, send email to [email protected] > <mailto:[email protected]>. > Visit this group at https://groups.google.com/group/ioio-users > <https://groups.google.com/group/ioio-users>. > For more options, visit https://groups.google.com/d/optout > <https://groups.google.com/d/optout>. > > -- > You received this message because you are subscribed to a topic in the Google > Groups "ioio-users" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/ioio-users/3MDLEEKtejY/unsubscribe > <https://groups.google.com/d/topic/ioio-users/3MDLEEKtejY/unsubscribe>. > To unsubscribe from this group and all its topics, send an email to > [email protected] > <mailto:[email protected]>. > To post to this group, send email to [email protected] > <mailto:[email protected]>. > Visit this group at https://groups.google.com/group/ioio-users > <https://groups.google.com/group/ioio-users>. > For more options, visit https://groups.google.com/d/optout > <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.
