Probleem met Python en Arduino

Hey landgenoten en of course België!

Ik heb deze vraag ook op het engelse gedeelte gepost maar post hem ook even hier zodat ik sneller antwoord heb :slight_smile: .

Laat me eerst uitleggen wat ik heb gemaakt.

Ik moest ervoor zorgen dat we de BlackMagic camera konden bedienen met een command op een Arduino Uno en een BlackMagic shield. Je kunt nu inzoomen door een z in te voeren met daarnaast een cijfer en je kunt de focus regelen door f en dan een cijfer.

Dus nu als ik z1 invoer in de Serial Monitor, werkt het perfect. Nu is mijn probleem wanneer ik in Python de code schrijf
"adruino.write (bytes (b" z1 "))" dat hij dan de zoom niet meer regelt.

Hoe los ik dit op?

Arduino code:

#include <BMDSDIControl.h>
#include <stdlib.h>
const int shieldAddress = 0x6E;
BMD_SDICameraControl_I2C sdiCameraControl(shieldAddress);

String inString = "";
boolean error = false;

void setup() {
  sdiCameraControl.begin();
  sdiCameraControl.setOverride(true);
  Serial.begin(9600);
}
void loop() {
  if (Serial.available() > 0) {    // is a character available?
    int inChar = Serial.read();
    error = false;
    //loop();

    if (inChar != '\n') { 

      // As long as the incoming byte
      // is not a newline,
      // convert the incoming byte to a char
      // and add it to the string
      inString += (char)inChar;
    }
    else {
      if(inString.substring(0,1) != "f" && inString.substring(0,1) != "z" || inString.substring(0) == "f" || inString.substring(0) == "z") {
          Serial.println("Fout! Gebruik 'f<getal>' voor focus en 'z<getal>' voor zoom");
          error = true;
          //return 0;
        }
        if (inString.substring(1) > "1"){
          Serial.println("Fout! Focus en zoom kunnen niet hoger dan '1'.");
          error = true;
        }
        if (inString.substring(1) < "0"){
          Serial.println("Fout! Focus en zoom kunnen niet lager dan '0'.");
          error = true;
        }
      if(inString.substring(0,1) == "f" && error == false){
      Serial.print("Input string: ");
      Serial.print(inString + ".");
      Serial.print("\t Focus is nu: ");
      inString.remove(0,1);
      Serial.println(inString);

    sdiCameraControl.writeCommandFixed16(
        1,                   // Destination:    Camera 1
        0,                   // Category:       Lens
        0,                    // Param:          Instantaneous Autofocus;
        0,
        inString.toFloat()
        );
        inString = "";
      }
      if(inString.substring(0,1) == "z" && error == false){
      Serial.print("Input string: ");
      Serial.print(inString + ".");
      Serial.print("\t Zoom is nu: ");
      inString.remove(0,1);
      Serial.println(inString);
        
    sdiCameraControl.writeCommandFixed16(
        1,                   // Destination:    Camera 1
        0,                   // Category:       Lens
        8,                    // Param:          Instantaneous Autofocus;
        0,
        inString.toFloat()
        );
        inString = "";
      }
      
      // clear the string for new input:
      inString = "";
    }
  }
}

Python code:

import serial 
import time

adruino = serial.Serial("COM8",9600)
#adruino.open()
print(adruino.is_open)
time.sleep(2)
def sendCommand():
   
    adruino.write(bytes(b"z1"))
    adruino.flush()
    print("writen")

    pass

sendCommand()

EDIT:

Na wat rondkijken op forums ben ik erachter gekomen dat \n de oplossing was. Dus hierbij de juiste code:

import serial 
import time

adruino = serial.Serial("COM8",9600)
#adruino.open()
print(adruino.is_open)
time.sleep(2)
def sendCommand():
    adruino.write(bytes(b"z1\n"))
    adruino.flush()
    print("writen")

    pass

sendCommand()

Hoi craftercis, welkom.

Sneller antwoord krijgen door te crossposten kun je vergeten.
Ten eerste is dit gewoonweg niet toegestaan op dit forum, en ten tweede neem je daarmee het risico dat meerdere mensen in verschillende threads je gaan proberen te helpen.
Die weten dan van elkaar niet wat er allemaal voor antwoorden zijn, en gaan je zeer waarschijnlijk tegenstrijdige tips geven.
En daar ben je nooit mee geholpen..
En bovendien is dat een klap in het gezicht voor iedereen die de tijd neemt je te antwoorden en je te helpen.

Nu inhoudelijk.
Het is heel jammer dat je schijnbaar veel tijd hebt doorgebracht met het speuren op het internet naar een oplossing van je probleem, terwijl die oplossing gewoon in je Arduino sketch staat.
Ook is het jammer dat jij niet vertelde wat je exact moest intypen om het commando te geven.
Want dat is niet "z1", maar "z1".
De \n staat namelijk voor een new line, 1 van 2 dingen die een druk op de enter toets teweegbrengt.
De andere is een Carriage Return (een term uit het mechanische typemachine tijdperk), die code is \r.

Het eerste wat je sketch doet (met een mooie uitleg erbij nog wel), is een reeks tekens binnenhalen net zolang tot er een \n word gezien !

Dit betekent dus dat je die code niet zelf geschreven hebt, of je eigen code niet meer begrijpt.
En dat is erg jammer.

Een les die je hier nog meer uit kunt leren geldt voor het coden, maar ook voor het stellen van vragen hier op het forum:
Wees zeer nauwgezet met wat je schrijft/communiceert.
Tijdens het stellen van je vraag had je dus niet moeten vergeten te vertellen dat je de enter toets ook moest indrukken voor je commando.