OK. I think I know why it isn't working. The way the input capture (PulseInput) works in the firmware is that a 200Hz (=5ms) timer kicks off the captures. I've done this in order to throttle the rate of pulse reports. So when you open a pulse input, it can take up to 5ms before it triggers a conversion. >From looking at the ping datasheet, it is not clear whether the operation is triggered by the rising edge or the falling edge or your pulse. If it is the falling edge, you should be able to do something like:
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 Sat, Apr 26, 2014 at 5:02 PM, Vic Wintriss <[email protected]>wrote: > It doesn't work when I close and then reopen the input line. Can you > recommend some tests that I can do to try and find out why it doesn't work? > > > On Saturday, April 26, 2014 4:57:52 PM UTC-7, Ytai wrote: >> >> Yes. This is what we tried before. I'm still under the impression that it >> should have worked but you've reported that it doesn't. >> >> Can I close the input while I am doing the strobe so that the input is >> not being exposed to both pulses? >> >> On Saturday, April 26, 2014 4:23:51 PM UTC-7, Ytai wrote: >>> >>> @Duane >>> At this point I'm convinced that there is no reason why this *should* work. >>> If it used to work in the past it is probably coincidental and you can of >>> course downgrade if you prefer. >>> I'm not going to spend any time supporting one specific sensor that has >>> a weird interface. You have several viable options for solving your problem: >>> >>> - Use a different sensor as recommended above. >>> - Filter out the trigger pulse using simple discrete logic as >>> recommended above. >>> - Change the firmware to support your use-case, for example, to >>> filter out pulses shorter than a certain limit or even having a dedicated >>> PING interface that can do both the output and input. >>> >>> @Vic >>> While you're generating the output with one pin and reading the input >>> with another, the latter pin is being exposed to both signals. >>> >>> >>> On Sat, Apr 26, 2014 at 4:20 PM, Vic Wintriss <[email protected]>wrote: >>> >>>> The output pulse and input pulse are not on the same pin. I assume by >>>> line you meant pin. Output is on one pin and input is on another pin. >>>> >>>> >>>> On Saturday, April 26, 2014 4:04:51 PM UTC-7, Ytai wrote: >>>> >>>>> PulseInput is primarily designed for: >>>>> >>>>> 1. Measuring rate or pulse-width of a pulse train signal, where it >>>>> is not necessarily important to get a result for each and every pulse. >>>>> This >>>>> is useful, for example, to measure speed of a wheel or to decode a >>>>> servo >>>>> signal. >>>>> 2. Measuring width of individual pulses that occur relatively >>>>> sporadically, like outputs from ultrasonics. >>>>> >>>>> In your case, we have two kinds of pulses (in/out) on the same line in >>>>> close proximity, and you're trying to extract one but not the other. Not >>>>> that there is anything particularly hard to implement such a feature, only >>>>> that it is not generic enough to be addressed in the standard interfaces >>>>> that I've developed. >>>>> >>>>> >>>>> On Fri, Apr 25, 2014 at 9:50 PM, Vic Wintriss <[email protected]>wrote: >>>>> >>>>>> I am just trying to put out a pulse on one pin and then read a pulse >>>>>> width on a different pin 750 microsecs later. Why do you say that it was >>>>>> not designed for such a use? >>>>>> >>>>>> >>>>>> On Wednesday, April 23, 2014 9:21:54 PM UTC-7, Ytai wrote: >>>>>> >>>>>>> Nope. The PulseInput module was really not designed for such a >>>>>>> use-case. If you had only the output pulses on the input things would >>>>>>> "just >>>>>>> work". Try the AND gate trick. >>>>>>> >>>>>>> >>>>>>> On Wed, Apr 23, 2014 at 9:15 PM, Vic Wintriss >>>>>>> <[email protected]>wrote: >>>>>>> >>>>>>>> I have tried all combinations of opening pulse input after sending >>>>>>>> the trigger pulse...no luck. I am reading both the output (trigger >>>>>>>> pulse) >>>>>>>> and the echo (return) pulse...alternately. About 5 trigger pulse >>>>>>>> readings >>>>>>>> to each echo pulse reading. Any work around ideas? >>>>>>>> >>>>>>>> >>>>>>>> On Wednesday, April 23, 2014 8:44:02 PM UTC-7, Ytai wrote: >>>>>>>> >>>>>>>>> Opening the pulse input after sending the pulse should have done >>>>>>>>> that. You shouldn't be able to get a pulse from the past the way >>>>>>>>> you're >>>>>>>>> doing this. Are you saying that what you're reading back is the output >>>>>>>>> pulse? >>>>>>>>> It is possible that there's a bug in the firmware side on the >>>>>>>>> PulseInput implementation in that case. >>>>>>>>> >>>>>>>>> >>>>>>>>> On Wed, Apr 23, 2014 at 2:33 PM, Vic Wintriss <[email protected] >>>>>>>>> > wrote: >>>>>>>>> >>>>>>>>>> I'm using 0503. >>>>>>>>>> >>>>>>>>>> The problem is that the ping and the return are getting out of >>>>>>>>>> sync. The getDuration() readings match exactly the times that I see >>>>>>>>>> on the >>>>>>>>>> scope. >>>>>>>>>> How can I synchronize so that I only start listening after the >>>>>>>>>> ping pulse is complete? >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On Wednesday, April 23, 2014 8:51:26 AM UTC-7, Ytai wrote: >>>>>>>>>> >>>>>>>>>>> Are you using the latest firmware? >>>>>>>>>>> Also, cancellation is supported. Search the forum for TimerTask. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On Tue, Apr 22, 2014 at 10:10 PM, Vic Wintriss < >>>>>>>>>>> [email protected]> wrote: >>>>>>>>>>> >>>>>>>>>>>> I tried the following: >>>>>>>>>>>> >>>>>>>>>>>> public void read() throws ConnectionLostException, >>>>>>>>>>>> InterruptedException { >>>>>>>>>>>> >>>>>>>>>>>> ioio.beginBatch(); >>>>>>>>>>>> >>>>>>>>>>>> leftStrobe.write(false); >>>>>>>>>>>> >>>>>>>>>>>> leftStrobe.write(true); >>>>>>>>>>>> >>>>>>>>>>>> leftStrobe.write(false); >>>>>>>>>>>> >>>>>>>>>>>> leftInput = ioio.openPulseInput(LEFT_ULTRASONIC_INPUT_PIN, >>>>>>>>>>>> >>>>>>>>>>>> PulseMode.POSITIVE); >>>>>>>>>>>> >>>>>>>>>>>> ioio.endBatch(); >>>>>>>>>>>> >>>>>>>>>>>> leftDistance = (int) (leftInput.getDurationBuffered() * >>>>>>>>>>>> 1000000); >>>>>>>>>>>> >>>>>>>>>>>> leftInput.close(); >>>>>>>>>>>> >>>>>>>>>>>> SystemClock.sleep(100); >>>>>>>>>>>> >>>>>>>>>>>> dashboard.log(leftDistance + ""); >>>>>>>>>>>> >>>>>>>>>>>> } >>>>>>>>>>>> It makes one reading and then hangs up. How do I time out if I >>>>>>>>>>>> want stop waiting? >>>>>>>>>>>> I put the scope on the sensor and discovered that I am reading >>>>>>>>>>>> alternately both the trigger pulse and the echo pulse...most often >>>>>>>>>>>> the >>>>>>>>>>>> trigger pulse. >>>>>>>>>>>> >>>>>>>>>>>> On Tuesday, April 22, 2014 5:05:23 PM UTC-7, Ytai wrote: >>>>>>>>>>>> >>>>>>>>>>>>> No, there isn't, and even if there were, I'm not sure this >>>>>>>>>>>>> will actually do what you want. >>>>>>>>>>>>> Have you tried the hack I recommended on the previous post? >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> On Mon, Apr 21, 2014 at 8:36 PM, Vic Wintriss < >>>>>>>>>>>>> [email protected]> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Good idea about the logic fix. I’m redoing the interface >>>>>>>>>>>>>> boards, so I might add that logic. >>>>>>>>>>>>>> If I am, in fact, reading part of the trigger pulse, is there >>>>>>>>>>>>>> any way of imposing a short, predictable delay…say 50 >>>>>>>>>>>>>> microsecs…after the >>>>>>>>>>>>>> trigger pulse but before the getDuration() read? >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Apr 21, 2014, at 5:12 PM, Ytai Ben-Tsvi <[email protected]> >>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> Good catch, I forgot about this constraint. >>>>>>>>>>>>>> In that case, this (similar to what you've proposed) approach >>>>>>>>>>>>>> might work: >>>>>>>>>>>>>> >>>>>>>>>>>>>> beginBatch(); >>>>>>>>>>>>>> generatePulse(); >>>>>>>>>>>>>> openPulseIn(); >>>>>>>>>>>>>> endBatch(); >>>>>>>>>>>>>> getDuration(); >>>>>>>>>>>>>> closePulseIn(); >>>>>>>>>>>>>> >>>>>>>>>>>>>> I'd like to emphasize that the fact we have to jump through >>>>>>>>>>>>>> weird hoops to get is working is mostly due to the fact that >>>>>>>>>>>>>> this sensor >>>>>>>>>>>>>> has a weird interface. BTW, another thing you can do is use a >>>>>>>>>>>>>> discrete >>>>>>>>>>>>>> logic gate to filter out the ping input pulse from the output. >>>>>>>>>>>>>> Something >>>>>>>>>>>>>> like: >>>>>>>>>>>>>> clean_out = ping_pin & !ioio_pulse_out_pin >>>>>>>>>>>>>> >>>>>>>>>>>>>> This will convert the Ping's interface to be similar to the >>>>>>>>>>>>>> one of the other sensor I referred you to. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Mon, Apr 21, 2014 at 3:23 PM, Vic Wintriss < >>>>>>>>>>>>>> [email protected]> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> I don't think that I can use getDurationBuffered() in this >>>>>>>>>>>>>>> case. The getDuration() Interface notes say: "...Note that once >>>>>>>>>>>>>>> a pulse is >>>>>>>>>>>>>>> detected, the next one must have its leading edge at least 5ms >>>>>>>>>>>>>>> after the >>>>>>>>>>>>>>> leading edge of the current one, or else it will be skipped." >>>>>>>>>>>>>>> The ping >>>>>>>>>>>>>>> pulse is about 50 microsecs long, and the echo pulse comes >>>>>>>>>>>>>>> about 750 >>>>>>>>>>>>>>> microsecs after the ping pulse, If I am getting the last part >>>>>>>>>>>>>>> of the ping >>>>>>>>>>>>>>> pulse, the echo pulse will come too soon for >>>>>>>>>>>>>>> getDurationBuffered() to >>>>>>>>>>>>>>> acquire the echo pulse. Am I understanding this right? >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On Sunday, April 13, 2014 7:22:39 PM UTC-7, Vic Wintriss >>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I am trying to use the Parallax Ping))) ultrasonic sensor >>>>>>>>>>>>>>>> with a ioio V1 board, using the IOIO00503 library. I get a >>>>>>>>>>>>>>>> good looking >>>>>>>>>>>>>>>> signal...see the attached scope view, but the >>>>>>>>>>>>>>>> input.getDuration() call >>>>>>>>>>>>>>>> returns 16.8 micro seconds most of the time, called 2 times >>>>>>>>>>>>>>>> per second. >>>>>>>>>>>>>>>> Every once in a while I get the proper number. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Any ideas? Here is the code: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> import ioio.lib.api.DigitalOutput; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> import ioio.lib.api.IOIO; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> import ioio.lib.api.PulseInput; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> import ioio.lib.api.PulseInput.PulseMode; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> import ioio.lib.api.exception.ConnectionLostException; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> public class UltraSonicSensors >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> { >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> private static final int LEFT_ULTRASONIC_INPUT_PIN = 35; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> private static final int LEFT_STROBE_ULTRASONIC_OUTPUT_PIN= 15; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> private final PulseInput leftInput; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> private DigitalOutput leftStrobe; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> private float leftDistance; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> private IOIO ioio; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> public UltraSonicSensors(IOIO ioio) >>>>>>>>>>>>>>>> throwsConnectionLostException >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> { >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> this.leftInput = ioio.openPulseInput(LEFT_ULTRA >>>>>>>>>>>>>>>> SONIC_INPUT_PIN, PulseMode.POSITIVE); >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> this.leftStrobe = ioio.openDigitalOutput(LEFT_ST >>>>>>>>>>>>>>>> ROBE_ULTRASONIC_OUTPUT_PIN); >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> this.ioio = ioio; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> public void read() throws ConnectionLostException, >>>>>>>>>>>>>>>> InterruptedException >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> { >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> read(leftStrobe, leftInput); >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> private void read(DigitalOutput strobe, PulseInput input) >>>>>>>>>>>>>>>> throws ConnectionLostException, InterruptedException >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> { >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> ioio.beginBatch(); >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> strobe.write(true); >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> strobe.write(false); >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> ioio.endBatch(); >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> this.leftDistance = input.getDuration(); >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> public float getLeftDistance() >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> { >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> return leftDistance; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> 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 a >>>>>>>>>>>>>> topic in the Google Groups "ioio-users" group. >>>>>>>>>>>>>> To unsubscribe from this topic, visit >>>>>>>>>>>>>> https://groups.google.com/d/topic/ioio-users/3MDLEEKtejY/uns >>>>>>>>>>>>>> ubscribe. >>>>>>>>>>>>>> To unsubscribe from this group and all its topics, 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 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 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.
