Question

Je suis un problème. J'ai récemment acheté une carte Arduino Uno . J'ai essayé de faire quelque chose de drôle comme le contrôle d'une entrée de mon ordinateur. Je Python avec pyserial et le programme est le suivant:

arduino = serial.Serial(portaCOM, 9600, timeout = 1)
... in loop ->
arduino.write(value)


  def sliderUpdate(self, event):
        pos = self.slider.GetValue()
        arduino.write(pos)
        time.sleep(.1)
        print arduino.readline()

try:
    arduino = serial.Serial(portaCOM, 9600, timeout = 1)
except:
    print "Errore di connessione alla porta seriale"

La valeur d'écriture doit envoyer la valeur à mon conseil si USB. Le programme chargé à bord est:

 const int ledPin = 11;
 byte brightness;

 void setup(){
     Serial.begin(9600);
     pinMode(ledPin, OUTPUT);
 }

 void loop(){
     while(Serial.available()){
         brightness = Serial.read();
         Serial.print(brightness);
         analogWrite(ledPin, brightness); //LED doesn't refresh the brightness
         delay(10);
     }
 }

Mon LED fonctionne correctement. J'ai essayé avec l'exemple fourni par fondu Arduino et cela fonctionne ..

J'ai vérifié si le programme envoie correctement les données. Oui, ça l'est. Il retourne la même chose que j'ai envoyé avant.

Il doit récupérer la valeur et jeu analaogWriter(pin, VALUE) envoyés, mais quelque chose ne va pas ou ne fonctionne pas.

Comment puis-je résoudre ce problème?

Solution

Le code Arduino

const int ledPin = 11;
byte valoreLed;

void setup(){
    Serial.begin(9600);
    pinMode(ledPin, OUTPUT);
}

void loop(){
    while(Serial.available()){
        valoreLed = Serial.read();
        analogWrite(ledPin, valoreLed);
        delay(20);
    }
}

code de script Python:

pos = self.slider.GetValue()
arduino.write(chr(pos))

Merci à tout le monde !! :)

Était-ce utile?

La solution

  1. Tout d'abord, assurez-vous que votre LED est correctement connecté. Anode (plus broches) au port et à la cathode PWM 11 (broche plus courte) à la masse, aussi vous devrez peut-être ajouter une résistance entre la cathode et la terre en fonction de LED.
  2. Assurez-vous que vous écrivez au port de python droit (ce câble FTDI est associé à votre système d'exploitation).
  3. Si vous n'êtes pas en utilisant un câble FTDI avec connecteur USB, assurez-vous que toutes les broches sont connectées aux entrées droite.
  4. Quelle est la valeur de value dans votre exemple? Essayez arduino.write(chr(0xFF)), ne reste allumé LED?

Autres conseils

Je soupçonne que arduino.readline() attend pour une nouvelle ligne, et vous envoie le code Arduino jamais une nouvelle ligne. Par conséquent, les blocs de code python indéfiniment après l'envoi de la première valeur.

Je vois dans vos commentaires que la LED fonctionne avec le premier caractère, mais vous ne voyez pas de changement avec les différents personnages. Définitivement assurez-vous que vous envoyez des caractères ASCII qui sont significativement différents des caractères précédents, par exemple envoyer un ASCII 0 suivi d'un ASCII 255.

Edit: Puisque vous dites que les œuvres d'exemple FadeLED, pouvez-vous simplement prendre cet exemple et ajouter des fonctionnalités de port série à elle? Par exemple, ne se fanent après un caractère de série est reçu. Cela permettra au moins vous familiariserez que le port série et peuvent coexister dans diodes électroluminescentes code que vous écrivez. De plus, je suppose que vous utilisez l'exemple de FadeLED . Si oui, assurez-vous que vous avez défini le nombre de broches correct, comme l'utilisation de code référence broche 9, mais votre exemple de code utilise la broche 11.

Une autre édition: Vous dites que vous recevez les caractères de l'arrière correctement Arduino, mais vous utilisez la fonction ReadLine pyserial, qui devrait bloquer jusqu'à ce qu'il voit un retour à la ligne, et je ne vois rien dans le code Arduino qui générerait une nouvelle ligne qui n » était pas t envoyé à ce premier. Pour éliminer le nombre de variables dans la question, essayez d'utiliser HyperTerminal ou un programme de port COM similaire à envoyer octets à l'Arduino, plutôt que votre programme Python. Par exemple, vous pouvez envoyer des espaces (ASCII 32) et « } » caractères ASCII (125), qui devrait être assez différente pour créer une différence visible dans la LED.

Je commencerai par établir de quel côté du port série ports du problème.

Tout d'abord, pouvez-vous conduire la LED en utilisant une boucle codée en dur sur l'Arduino. Est-ce que le changement LED sa luminosité comme prévu?

Une fois cette étape de la route, pouvez-vous faire quelque chose de l'Arduino faire visiblement correct lors de l'envoi des choses manuellement à partir d'une application de terminal (par exemple l'un intégré dans l'IDE Arduino). Cela peut nécessiter des modifications au code Arduino.

Une fois que cela fonctionne, je puis se concentrer sur le code Python, en vous assurant que vous parlez au port COM etc.

« la valeur d'écriture doit envoyer la valeur à mon conseil via USB »

Si ce n'est pas une faute de frappe, vous ne pouvez pas utiliser pyserial pour accéder aux ports USB. Il y a lieu pyusb, et probablement d'autres.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top