parallax ping)) et picaxe 28x1

kooj

New Member
Bonjour,


Voilà je possède un starter kit picaxe 28x1 et un L239D.

J'aimerais faire tourner 2 moteurs en fonction des valeurs d'un capteur à ultrasons.

En faisant juste tourner le capteur à ultrasons pour obtenir la valeurs de la tension caractérisant la distance, il n'y a aucun problème et il fait ça instantanément dans une boucle infinie.

Cependant, en faisant tourner les moteurs en fonction de la valeurs trouvée, le capteur à ultrason oscille entre 0 et la valeurs mesurée. Il est donc impossible pour moi de mettre un "if ..." si la valeur oscille.

Mon programme pour le capteur est le suivant :

Capteur:

low portc 0
high portc 0
pause 1
low portc 0
dscint %00000000
pulsin 0, 1, w0

(comme cité plus haut, je l'ai mis dans une boucle infinie et juste ces commandes il n'y a pas de problème, la valeur w0 ne vaut jamais 0.

Si je fais un code du style :

Main:

do
low portc 0
high portc 0
pause 1
low portc 0
dscint %00000000
pulsin 0, 1, w0
if w0 > $0040 then goto goforward
elseif w0 < $0040 then goto gostop
end if
loop

goforward:

high 4 : low 5 : high 6 : low 7
goto main

gostop:

low 4 : low 5 : low 6 : low 7
goto main

Là, en mettant un debug w0, je vois la valeur de w0 osciller entre 0 et $xxxx avec une période d'une demi-seconde.

Il y a aussi la valeur de "outpins" qui est modifiée tandis que dans le 1er cas elle ne l'est pas.

Aidez moi s'il vous plait, je ne comprend pas le problème :(

Merci beaucoup !

Cordialement

kooooj
 
Bonsoir,

juste une idée..... en faisant un let

"...
pulsin 0, 1, w0
let w0 = w0
if w0 > $0040 then goto goforward
..."

pas testé...

bonne suite

technopengl
 

kooj

New Member
Merci pour ta réponse, je vais essayer.

J'ai fais quelques recherches et je pense que c'est peut-être lié à ça :

Wordvariable receives the result (1-65535). If timeout occurs (0.65536s) the result will be 0.

:confused::confused::confused:
 
et en utilisant la commande count? Mais là je crains d'avance que non... il compte les impulsions, mais ce qui est souhaité, c'est de compter la longueur de l'impulsion à partir d'un front montant...?
 
Je ne sais pas quel est ton capteur à ultra son, avec le mien j'avais ce code... mais cela fait longtemps
Code:
symbol trig = 1            ‘ Define output pin for Trigger pulse
symbol echo  = 0           ‘ Define input pin for Echo pulse
symbol range = w1          ‘ 16 bit word variable for range
main:
    pulsout trig,2        ‘ produce 20uS trigger pulse (must be minimum of 10uS)
    pulsin echo,1,range    ‘ measures the range in 10uS steps
    pause 10               ‘ recharge period after ranging completes
‘ now convert range to cm (divide by 5.8) or inches (divide by 14.8)
‘ as picaxe cannot use 5.8, multiply by 10 then divide by 58 instead
    let range = range * 10 / 58 ‘ multiply by 10 then divide by 58
    debug range ‘  display range via debug command
    if range<50 then
    high 0
    end if
    if range=5 then
    low 0
    end if
    goto main ‘  and around forever
 

kooj

New Member
Sur ce capteur tu possèdes une pin pour émettre la pulse et une pin pour capter la pulse, tandis que le mien possède une pin pour les deux :(
 

PieM

Senior Member
Bonjour,

vous devriez envoyer la totalité du programme, car les instructions de votre post sont pas compréhensibles par programming editor !
low port c , dscint %00000000 ?


Quel type de capteur est utilisé ? si c'est un SRF05, la commande est:

pulsout 0, 2 ' envoi d'une impulsion de 10µs (si 8MHz)
pulsin 0, 1, w0
et ne pas mettre de pause entre le pulsout et le pulsin !

Concernant le capteur de Parallax, la commande est identique ...
 
Last edited:

inglewoodpete

Senior Member
Bonjour, Il est près de 40 ans depuis que j'ai appris le français au lycée et je n'ai pas voyagé en Nouvelle-Calédonie ou en France à la pratique. Merci à "Google Translate"!

Heureusement, j'ai reconnu Ping)) et 28x1 en vous publiez. J'ai réussi une interface Ping Parallax))) à une 28x1. J'ai utilisé une diode 1N4148 pour connecter une broche de sortie avec une broche d'entrée - cathode se connecte à la broche d'entrée. Le code est aussi très simple.
Code:
#Picaxe 28x1
#Terminal 9600                       'Open PE Terminal immediately 8 MHz at 9600baud
   '
   Symbol wUltraSonic  = w11         'Reading position using ultrasonic distance finder
   Symbol wSequenceNum = w12         'Count
   '
   'Port B: Outputs 
   Symbol oStartUltra  = 7           'Leg 28 For output pulse to start ultrasonic rangefinder
   ' 
   'Port C: Inputs (can also be used as outputs or special comms functions) 
   Symbol PortC_Dirs   = %00000000   'Set pins as inputs control 
   Symbol iUltra       = 0           'Leg 11 Diagnostic Data Input
   '
   'Constants
   Symbol Lo           = 0
   Symbol Hi           = 1
   Symbol cPause100mS  = 200
   '
   SetFreq m8
   wSequenceNum = 0
   SerTxd("Seq.,UltraSound", CR, LF)
   Do
      PulsOut oStartUltra, 1         '5uS
      PulsIn iUltra, Hi, wUltraSonic 'Read time as a word
      Inc wSequenceNum
      SerTxd(#wSequenceNum, ",", #wUltraSonic, CR, LF)
      Pause cPause100mS
   Loop                              'Endless loop
 

Attachments

Last edited:

PieM

Senior Member
Bonjour,

@ inglewoodpete:

le capteur Ping)) ne comporte qu'un seul pin pour in et out !
donc oStartUltra et iUltra ne font qu'un ... :)

sorry ! je n'avais pas vu que c'était un 28x1 avec des entrées/sorties figées !

j'efface tout ...
 
Last edited:

inglewoodpete

Senior Member
Bonjour,

@ inglewoodpete:

le capteur Ping)) ne comporte qu'un seul pin pour in et out !
donc oStartUltra et iUltra ne font qu'un ... :)

sorry ! je n'avais pas vu que c'était un 28x1 avec des entrées/sorties figées !

j'efface tout ...
Le Ping)) a en effet seulement 1 pour les deux broches d'entrée et de sortie. Vous devez utiliser 2 broches PICAXE pour faire fonctionner le Ping))

La broche de sortie du PICAXE démarre le Ping)) via la diode. (La sortie est PICAXE l'impulsion, de sorte que la broche d'entrée PICAXE ignore cette impulsion.)

Ensuite, la broche d'entrée PICAXE mesures de la réponse impulsionnelle.

J'ai utilisé ceci et cela fonctionne bien.

J'espère que "Google Translate" le dit clairement:)

En anglais ....

The Ping)) indeed has only 1 pin for both input and output. You must use 2 PICAXE pins to operate the Ping))

The output pin of the PICAXE starts the Ping)) via the diode. (The PICAXE is outputting the pulse, so the PICAXE input pin ignores this pulse.)

Then the PICAXE input pin measures the pulse response.

I have used this and it works well.

I hope "Google Translate" makes this clear :)
 

PieM

Senior Member
Bonjour,

I hope "Google Translate" makes this clear
oui, la traduction est très claire !...

en fait j'utilise un même type de capteur, (1 pin in / out) mais avec des 28x2 ou 18M2. donc la diode est inutile, car la même broche peut être pulsin et pulsout.
Votre solution est très astucieuse . :)

kooj utilise le port C qui peut être soit in soit out pour générer un pulse de 1ms.
sans avoir immédiatement après l'instruction pulsin.
il est possible que le problème vienne de là.
 

kooj

New Member
Bonjour,

Navré de répondre aussi tard et merci à tous pour vos réponses !

Effectivement, j'utilise la même I/O pour générer à la fois le pulsout et mesurer le pulsin. Cependant, le capteur fonctionne très bien de manière totalement indépendante. Alors pourquoi, lorsque je met un moteur qui tourne en fonction de la valeur "pulsin" mesurée, celui-ci se met à tourner par acoups ? J'ai essayé de doubler la valeur de la fréquence, ceci ne change pratiquement rien.

Je tiens à préciser que les acoups sont instable, une fois le moteur tourne pendant 1/4 de sec avant de s'arreter, une fois il tourne pendant 1 sec.

Pensez-vous que faire un montage sur 2 pins dont celui en input avec un diode changerait ce problème ?

Avez-vous d'autres propositions ?

Merci à vous !
 

PieM

Senior Member
Bonjour,

Si le moteur tourne de façon aléatoire, c'est que la valeur w0 est aléatoire.

Ignorant le schéma de votre installation, je vous conseille de mettre un condensateur de filtrage (10µF ou plus) immédiatement à l'entrée de votre ping)) entre le V+ et le 0V.
Il est fort possible aussi que cela soit dû à un problème de temps entre l'envoi des impulsion US et le pulsin (timeout).

Comme demandé en #10, mettez en ligne votre programme tel qu'il a été chargé dans le picaxe, celui que vous indiquez n'est pas valable sur le plan de la syntaxe.
Il est difficile de répondre à une question quand on a pas les bons éléments, et ça fait gagner du temps pour tout le monde...:)

inglewoodpete vous a donné une méthode qui me semble plus correcte pour générer un vrai pulsout que de changer l'affectation des entrées sorties.
Sur le 28X1, C.0 est également utilisé comme timer clk. (?)

Je renouvelle aussi ma question concernant le "dscint %00000000" avant le pulsout. ???
 

kooj

New Member
Tout d'abord voici mon code:
main:
DO
low portc 0
high portc 0
pause 1
low portc 0
let dirsc = %00000000
PULSIN 0, 1, w0
if w0 > $0050 then gosub goforward
if w0 < $0050 then gosub gostop
debug w0
debug outpins
LOOP

goforward:
high 4 : low 5 : high 6 : low 7
return

gostop:
low 4 : low 5 : low 6 : low 7
return
La fonction : let dirsc = %00000000 sert à transformer la sortie en entrée
 
Last edited:

kooj

New Member
En fait, la valeur de w0 oscille entre 0 et la bonne valeur, mais elle devrait être constante si l'obstacle est toujours à la même distance. Or elle ne l'est pas.

Par exemple la valeur en hexa de cette distance vaut $0060.

Alors, pendant l'essai, la valeur w0 vaudra $0060, puis $0000, puis $0060, puis $0000, etc... et à période variable...
 

PieM

Senior Member
Il n'est pas certain que votre let dirsc = %00000000 soit nécessaire, car l'instruction pulsin va mettre , je crois, C.0 en situation d'entrée. (à vérifier)
évitez toute instruction entre le pulsout et le pulsin.

le debug outpins ne sert à rien. une seule instruction debug suffit, et que outpins change est normal puisque vous changez l'état des sorties!

Si ce phénomène se produit dès que vous mettez des moteurs en action, faites ce que je vous dis en #16.
 

kooj

New Member
De placer un condensateur ? A quoi cela sert-il précisément je ne comprend pas.

Je ne pense pas que le problème vienne du code... Est-ce une alimentation trop faible peut-être ?
 

PieM

Senior Member
Un condensateur de filtrage limite la transmission des parasites liés aux moteurs.
Une petite recherche sur le net avec "condensateur de filtrage" vous en dira plus. :)

pour ce qui concerne le code, je vous ai proposé d'éviter toute instruction entre le pulsout (de préférence un vrai comme proposé par inglewoodpete) et le pulsin. Mais faites comme vous le pensez.

Quant à l'alimentation, difficile à distance de dire si elle est bien dimensionnée et en bon état ...
 

kooj

New Member
Serait-il possible de vous demander un schéma entre le uC, le condo, la diode et la pin du capteur qui utilise le condo ? En imaginant que la pin "signal" du capteur est séparée en 2, pour le pulsin et le pulsout.

Merci beaucoup cela m'aiderait grandement !
 

inglewoodpete

Senior Member
Du Ping))) datasheet:
* Entrée de déclenchement - positive impulsion TTL, 2 uS min, 5 uS typique
* Echo Pulse - positive impulsion TTL, 115 uS à 18,5 ms
* Echo Hold-off - 750 us de l'automne de déclenchement d'impulsions
* Fréquence Burst * - 40 kHz pour 200 us

J'ai trouvé que le High <pin>: Low <pin> pris trop de temps et a confondu la Ping))), même sans la pause de 1 ms. Le Ping s'attend à une impulsion de déclenchement très court (5uS). High / Low créer une impulsion de 500 ms (environ) - trop longtemps. 1,5 ms est beaucoup trop long! Le «laisser dirsc =% &#8203;&#8203;00000000" utilise tout l'Hold Off temps.

Essayez mon circuit et le code: vous verrez que ça marche!
 
Last edited:

PieM

Senior Member
Serait-il possible de vous demander un schéma entre le uC, le condo, la diode et la pin du capteur qui utilise le condo ? En imaginant que la pin "signal" du capteur est séparée en 2, pour le pulsin et le pulsout.
la diode a son anode (+) connectée à B.7 et sa cathode (-) connectée à C.0.
le capteur ping)) a sa broche signal connectée sur C.0.
voir le schéma de inglewoodpete.

Comme déjà dit, un éventuel condensateur est connecté entre le V+ et le 0V du capteur.

Votre programme devient:
#picaxe 28X1

main:

DO
Pulsout 7, 1
Pulsin 0, 1, w0
if w0 > $0050 then :gosub goforward
else: gosub gostop
endif
pause 200
LOOP

goforward:
high 4,6 : low 5,7
return

gostop:
low 4,5,6,7
return
 

kooj

New Member
Merci beaucoup pour vos réponses !
J'essaierai tout ça en fin de semaine, car je suis plombé d'examens en ce moment et je n'ai que très peu de temps...

Merci encore PieM et Inglewoodpete
 
Top