[PD] arduino-help.me.please.pd [gadlletas]

Martin Peach martinrp at alcor.concordia.ca
Tue May 30 18:16:58 CEST 2006


Hans-Christoph Steiner wrote:
> 
> On May 29, 2006, at 5:35 PM, Martin Peach wrote:
> 
>> Christian Klippel wrote:
>>
>>> hello,
>>> servo's are _slightly_ different in that they dont take the  
>>> classical pwm that you can regulate from 0..100%.
>>> instead, a servo needs a repetetive pulse between 1 and 2  miliseconds.
>>> that pulse train can have a frequency from 30 to 400 hz, for  
>>> example, but the pulse width stays in the same range. a pulse of  1.5 
>>> ms positions the servo into the center, 1 and 2 ms are for the  full 
>>> movement to the left or right respectively.
>>> in the controller you need a loop (or, preferably, an interrupt)  
>>> that just waits some 20 ms, then sets the pulse on, waits 1 to 2  ms, 
>>> and turns off again, then repeat ....
>>
>>
>> ...or a 50Hz pwm with a positive pulse width varying between 5 and  10 
>> percent. Doing this from a soundcard output is bad because 50Hz  is 
>> close to the low-frequency cutoff of the card, so the parts of  the 
>> pulse that should be at either 0V or 5V will actually drift  towards 
>> each other. You would need to add a comparator to get a  digital level 
>> signal.
>> The arduino digitalWrite command in conjunction with  
>> delayMicroseconds (for the positive pulse)and delay (for the  negative 
>> pulse) should be OK for this.
>> Martin
> 
> 
> So it should be possible to generate this signal in Pd and output it  
> via the serial port to control a digital output pin.  The serial port  
> runs at 115,200 b/s, which is more than enough to control something  at 
> 1-2ms.  The question is whether you can get an steady stream.  If  there 
> is too much jitter, then it wouldn't work.
> 

For controlling a servo the jitter between pulses isn't too important, 
it can be about 2ms. The pulse itself has to be more precise and between 
1 and 2ms. If you do this with a serial byte, you only have about 5 
different angles on the servo, since you can only send 0x00, 0x80, 0xC0, 
0xE0, 0xF0 at some baud rate around 4000 to get pulses between 1 and 2 
ms. (The pulse would be the start bit and up to 8 zero bits following it.)
The other way is to toggle DTR. Not sure if comport lets you do this (I 
don't think ist does) but it would be useful just for controlling simple 
on/off things. To control a 90 degree servo to a precision of one degree 
you need pulse precision down to 1/90 ms or about 10 microseconds.

Also there is still the problem of voltage levels. The servo wants 0-5V, 
DTR could be 12V, and TXD is -12V - + 12V, so you need something before 
the servo, to reduce the voltage, could be just a couple of resistors.

The parallel port would be better for this (voltages are better and you 
have more pins to play with) but they seem to be on the road to 
extinction as well as harder to access than serial ports.

Something like this 
http://www.hvwtech.com/products_view.asp?CatID=113&SubCatID=146&SubSubCatID=0&ProductID=449
is a better solution if you can't/don't want to build your own.

Martin


> To make Pd do this is message space, you could change the block size  to 
> a very small amount.  I wonder if this would work...
> 
> .hc
> 
> ________________________________________________________________________ 
> ____
> 
> "Computer science is no more related to the computer than astronomy  is 
> related to the telescope."
>                                                           -Edsger  Dykstra
> 
> 





More information about the Pd-list mailing list