Freitag, 16. Januar 2015

Arduino Control (Teil 4) – Potentiometer Wert am PC ausgeben

image

Der Arduino kann auch analoge Signale einlesen. Dieser Wert kann zwischen 0 und 1023 liegen. Für dieses Beispiel wird ein Potentiometer verwendet, der möglichst hochohmig sein sollte. In meinem Fall habe ich einen 470 Ohm Stellwiederstand verwendet. Empfohlen ist 1k Ohm.

image

Der Quellcode ähnelt dem Beispiel für den Button. Nur müssen hier für den Empfang zwei Bytes zu einem Wert zusammengesetzt werden. Das Stichwort ist hier Byte Shifting. Das erste Byte wird um acht Bits nach links verschoben, um die Bits von 9 bis 16 abzubilden. Das zweite Byte bleibt für die ersten acht Bits.

static void Main(string[] args)
{
   // Die Verwendete COM Verbindung
    // sollte der aus dem Arduino Programm entsprechen.
    SerialPort sp = new SerialPort("COM16", 115200);

    // Event zuweisen für den Empfang.
    sp.DataReceived += sp_DataReceived;

   // Verbindung öffnen.
    // Wenn das Programm gestartet ist,
    // sollte der Arduino bereits mit dem PC verbunden sein.
    sp.Open();

    while (true)
    {
       // Nur warten.
        Thread.Sleep(1000);
    }
}


// Wird ausgeführt, wenn Daten im Empfangspuffer vorhanden sind.
static void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // SerialPort aus 'sender' casten.
    SerialPort sp = (SerialPort)sender;

    // Bytes einlesen vom Empfang und auf die Console wiedergeben.
    byte[] buffer = new byte[2];
    if (sp.Read(buffer, 0, 2) != 0)
    {
        Console.Clear();
        // Die zwei empfangenen Byte müssen wieder zusammengelegt werden,
        // um den Eigentlichen Wert wiederzugeben.
        Console.WriteLine("Received: {0}", (int)buffer[0] << 8 | buffer[1]);
    }
}

Der Input verwendet diesmal analogRead(), statt des digitalRead(). Unterscheidet sich der Wert zu dem zuletzt versendeten, dann soll der neue gemessene Wert gesendet werden. Der Wert kann bis zu 1023 betragen und passt nicht in ein Byte. Daher wird dieser in zwei Bytes aufgeteilt und anschließend versendet. Am Ende wird eine Verzögerung von 100 Millisekunden festgelegt, um zwischen den Sendungen eine Lücke zu erzeugen. Ansonsten kann nicht erkannt werden, welches das erste und das zweite Byte ist.

// Pin Nummer A0 vom Arduino
int pinPegel = A0;

// Enthält den letzten Button Zustand.
int lastValue = 0;

void setup()
{
  // Baudrate wie bei dem C# Programm
  Serial.begin(115200);
  pinMode(pinPegel, INPUT);
}

void loop()
{
  // Status am Pin abfragen
  int readValue = analogRead(pinPegel);
 
  // Nur Inhalt im If ausführen,
  // wenn der Status sich geändert hat.
  if(readValue != lastValue)
  {
   // Member Field überschreiben.
    lastValue = readValue;
  
   // Buffer vorbereiten und
   // den Wert in zwei bytes aufteilen.
    byte ba[2];
    ba[0] = (byte)((readValue >> 8) & 0xff);
    ba[1] = (byte)(readValue & 0xff);
   
    // Buffer Inhalt von zwei Bytes senden.
    Serial.write(ba, 2);
       
    // Ermöglicht das Erkennen vom 1. und 2. Byte
    // in dem zwischen den Sendungen eine Pause gesetzt wird.

    delay(100);
  }
}

Damit ist auch schon alles getan.

 

Quellcode zum Download

Dienstag, 13. Januar 2015

Arduino Control (Teil 3) – LED mit dem PC Dimmen

image

Nicht alles lässt sich immer sinnvoll mit Ein- und Ausschalten lösen. Möchte man eine LED dimmen, so sollte ein PWM Signal verwendet werden. Ein PWM verwendet einen Timer, um das Rechtecksignal abzubilden. Daher können nur sechs bestimmte Ausgänge am Arduino (D3, D5, D6, D9, D10, D11) verwendet werden. Die Pins sind daran zu erkennen, dass neben den Anschlüssen ein kleines Wellensymbol zu sehen ist (oder sie sind direkt mit PWM beschriftet).

image

Der Programm Code ist dem ersten Beispiel Ähnlich. Beim Senden jedoch, kann ein Wert von 0 bis 255 angegeben werden.

static void Main(string[] args)
{
    // Die Verwendete COM Verbindung
    // sollte der aus dem Arduino Programm entsprechen.
    SerialPort sp = new SerialPort("COM16", 115200);

    // Verbindung öffnen.
    // Wenn das Programm gestartet ist,
    // sollte der Arduino bereits mit dem PC verbunden sein.

    sp.Open();

    while (true)
    {
        Console.Write("Bitte geben sie einen Wert von 0 bis 255 ein und drücken sie anschließend die Enter Taste: ");

        // Abfrage eines Wertes.
        string readline = Console.ReadLine();

        // Zeichenkette in einen Integer Wert umwandeln.
        byte value = byte.Parse(readline);

       // Sendet den Wert.
        sp.Write(new byte[] { value }, 0, 1);
    }
}

Für den Empfang im Arduino wird diesmal für die LED Ansteuerung der Pin D3 verwendet. Und anstatt eines digitalWrite wird ein analogWrite verwendet.

// Pin 3 für die LED Beleuchtung
int pinPwmOut = 3;

void setup()
{
  // Baudrate wie bei dem C# Programm
  Serial.begin(115200);
 
  // Pin 3 für die LED
  pinMode(pinPwmOut, OUTPUT);
}

void loop()
{
  // Wenn neue Daten verfügbar sind.
  if(Serial.available() > 0)
  {
    // Liest den empfangen Byte Wert ein
    byte value = Serial.read();
   
    // Empfangener Byte Wert für das PWM Signal verwenden.
    analogWrite(pinPwmOut, value);
  }
}

Nach Eingabe eines Wertes von 0 bis 255 sollte die LED weniger oder heller leuchten. Durchschnittlich haben die LEDs eine Stromaufnahme von 20mA. Der Unterschied liegt in der Farbe, die unterschiedliche Spannungen für den Betrieb benötigen.

Farbe Spannung Berechneter Vorwiderstand Widerstand aus der E6 Reihe
Rot 1,6V 170 220 Ohm
Grün 2,1 145 150 Ohm
Blau 2,9 105 100 Ohm

Wenn die technischen Daten der verwendeten LED bekannt sind, dann kann der Widerstand mit der Formel R = U / I berechnet werden.

image

Das Schaltbild weist keine Besonderheiten auf, stelle dies jedoch zur Vollständigkeit mit in den Post ein.

image

Wie zu sehen ist, lässt sich dieses Beispiel schnell umsetzten.

 

Quellcode zum Downloaden

Dienstag, 6. Januar 2015

Arduino Control (Teil 2) – Button Status auf PC wiedergeben

image

Eine Eingabe vom PC zum Arduino zu bringen ist nicht sonderlich schwierig. Das Gleiche gilt auch bei der Umsetzung einer Tasteneingabe vom Arduino zum PC. Am Arduino wird diesmal eine kleine Schaltung mit einem Button zusammengesteckt.

Zusätzlich benötigt: Taster und 10k Ohm Wiederstand

image

Kommen wir zum Consolen Programm. Wie im vorherigen Post, werden die selben Verbindungsparameter verwendet.

Für den Empfang wird noch der hierfür erforderliche Event hinzugefügt. Sobald sich also Daten im Eingangspuffer befinden, wird der Inhalt der Event Methode ausgeführt.

In der Schleife wird diesmal nur ein 'Thread.Sleep' eingesetzt; das soll verhindern, dass die Anwendung zu viel der CPU Zeit beansprucht (und es nicht so wirkt, als wäre sie eingefroren).

static void Main(string[] args)
{
    // Die Verwendete COM Verbindung
    // sollte der aus dem Arduino Programm entsprechen.

    SerialPort sp = new SerialPort("COM16", 115200);

    // Event zuweisen für den Empfang.
    sp.DataReceived += sp_DataReceived;

   // Verbindung öffnen.
    // Wenn das Programm gestartet ist,
    // sollte der Arduino bereits mit dem PC verbunden sein.
    sp.Open();

    while (true)
    {
        // Nur warten.
        Thread.Sleep(1000);
    }
}

// Wird ausgeführt, wenn Daten im Empfangspuffer vorhanden sind.
static void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // SerialPort aus 'sender' casten.
    SerialPort sp = (SerialPort)sender;

    // Byte einlesen vom Empfang und auf die Console wiedergeben.
    Console.WriteLine("Received: {0}", sp.ReadByte() == 0x01);
}

Der Code für den Arduino kann sich den letzten Zustand des Button "Drücken" merken. Damit wird nur gesendet, wenn sich der Zustand geändert hat. Für das Senden wird im Beispiel der selbe Hex Wert verwendet.

// Pin Nummer A0 vom Arduino
// an dem ein HIGH (gedrückt) oder
// LOW (nicht gedrückt) gelesen wird.

int pinButton = A0;

// Enthält den letzten Button Zustand.
boolean buttonState = false;

void setup()
{
  // Baudrate wie bei dem C# Programm
  Serial.begin(115200);
  pinMode(pinButton, INPUT);
}

void loop()
{
  // Status am Pin abfragen
  boolean readState = digitalRead(pinButton);
 
  // Nur Inhalt im If ausführen,
  // wenn der Status sich geändert hat.
  if(readState != buttonState)
  {
   // Member Field überschreiben.
    buttonState = readState;
  
    // Wenn 'true' sende 0x01 für ist gedrückt
    if(buttonState == true)
    {
      Serial.write(0x01);
    }
    else
    {
      Serial.write(0x00);
    }
  }
}

Das war schon auch wieder alles. Nun können mit dem Beispiel Eingaben vom Arduino auf dem PC wiedergegeben werden.

Quellcode zum Downloaden

Sonntag, 4. Januar 2015

Arduino Control (Teil 1) – LED ein und ausschalten

image

Diesmal gehen die folgenden Beispiele darauf ein, einen Arduino mit seinen Eigenschaften anzusteuern. Im Wesentlichen handelt dieser mehrteilige Blog Post davon, wie eine Eingabe vom PC zum Arduino kommt und auch wieder zurück.

Die Anforderung wird sein, dass mit der Enter Taste die rote LED auf dem Arduino ein oder ausgeschaltet wird. Für das erste Beispiel reicht daher ein Consolen Programm aus, um eine Eingabe aufzunehmen und einen Befehl entsprechend zu senden. Beide Programme müssen dieselbe Baudrate haben, die hier bei 115200 Baut liegt.

static void Main(string[] args)
{
    // Die Verwendete COM Verbindung
    // sollte der aus dem Arduino Programm entsprechen.
    SerialPort sp = new SerialPort("COM16", 115200);

    // Verbindung öffnen.
    // Wenn das Programm gestartet ist,
    // sollte der Arduino bereits mit dem PC verbunden sein.
    sp.Open();

    // Wird verwendet um den Zustand zu wechseln.
    bool changeState = true;

    // Der Eigentliche Steuerinhalt wird immer wieder ausgeführt.
    while (true)
    {
        // Programm hält an dieser Stelle,
        // bis die Enter Taste gedrückt wurde.

        Console.ReadLine();

        // Ist der Wechsel Status 'True'...
        if (changeState)
        {
            //... dann soll die LED eingeschaltet werden.
            sp.Write(new byte[] { 0x01 }, 0, 1);
        }
        else
        {
            //... dann soll die LED ausgeschaltet werden.
            sp.Write(new byte[] { 0x00 }, 0, 1);
        }

        // Wechselt den Zustand von True auf False oder umgekehrt.
        changeState = !changeState;
    }
}

Hinweis: Hier im Beispiel verwende ich COM16, der wahrscheinlich angepasst werden muss. Das könnte dann ggf. über dem Arduino Programm gesichtet werden.

image

Nun muss der Arduino die Sendung vom Programm verstehen. Momentan wird erwartet das Hex 0x01 oder Hex 0x00 empfangen wird.

void setup()
{
  
// Baudrate wie bei dem C# Programm
  Serial.begin(115200);

  // Pin 13 für die Rote LED
  pinMode(13, OUTPUT);
}

void loop()
{
  // Wenn neue Daten verfügbar sind.
  if(Serial.available() > 0)
  {
    // Wird am Serial 0x01 gelesen, wird an die
    // Methode digitalWrite ‘true’ übergeben.

    digitalWrite(13, Serial.read() == 0x01);
  }
}

Das war im Grunde schon alles. Wenn nun das C# Programm gestartet wird und der Arduino bereits angeschlossen ist, so kann dann mit der Enter Taste die Rote LED ein und ausgeschaltet werden.

Quellcode zum Downloaden

Gehäuseentwurf für Signalleuchten (ESP32)

RGB LEDs und LIPO Akkus sind bestellt. Weil ich bereits die Abmessungen habe, kann ich schon mal mit dem Gehäuseentwurf in Blender anfangen....