Komunikacja między własnym programem a Arduino

Komunikacja między własnym programem a Arduino

Postprzez kijek » 02.02.2012 (Cz) 21:53

Witam. Ostatnimi czasy zmagam się z pewnym problemem. Otóż chciałbym mieć możliwość sterowania Arduino przy pomocy własnego programu. W tym celu skorzystałem z tego poradnika. Dopóki testowałem kod, który został tam podany, wszystko było dobrze. Jednak gdy zabrałem się za pisanie własnego kodu, pojawiły się problemy.
Może jednak przed opisaniem problemu, wspomnę, co postawiłem sobie za cel. Otóż w zależności od wysłanej z komputera wartości, zaświecić miała się dana ilość diod LED. Całość połączyłem w sposób przedstawiony na tym obrazku.
To niewątpliwie jest zrobione dobrze, gdyż jeśli wartość wysyłam poprzez IDE Arduino, układ działa poprawnie. Pomijając fakt, iż wartość odbierana przez Arduino jest o 48 większa od wysłanej.

Problem pojawia się dopiero w momencie, gdy wartość ma zostać wysłana przez mój program, gdyż najwyraźniej nie jest ona wysyłana.

Kod programu w C++ (Ard.cpp)
Kod: Zaznacz cały
#include "stdafx.h"
#include <iostream>

using namespace System;
using namespace System::IO::Ports;

int main(array<System::String ^> ^args)
{
   String^ odpowiedz;
   String^ nazwaPortu;
   int predkosc = 57600;
   int liczbaDiod = 0;

   Console::WriteLine("Podaj nazwe portu, do ktorego podlaczone jest Arduino i wcisnij ENTER");
   nazwaPortu = Console::ReadLine();

   SerialPort^ arduino;

   arduino = gcnew SerialPort(nazwaPortu, predkosc);

   try
   {
      arduino->Open();

      do
      {
         Console::WriteLine("Wpisz, ile diod ma sie swiecic");
         std::cin >> liczbaDiod;

         if(liczbaDiod<=4)
         {
            Console::WriteLine("...");
            arduino->std::cout << liczbaDiod;
         }

         else
         {
            Console::WriteLine("Nie mozna zapalic wiecej, niz 4 diod!");
         }

         Console::WriteLine("Sprobowac ponownie? t/n");
         odpowiedz = Console::ReadLine();

         Console::Clear();
      }while(String::Compare(odpowiedz, "t")==0);
      
      arduino->Close();
   }

    return 0;
}

Kod programu dla Arduino (sketch_jan13a.ino)
Kod: Zaznacz cały
int LED[] = { 10, 11, 12, 13 };
int stan = 0;

void setup()
{
 
  pinMode(LED[0], OUTPUT);
  pinMode(LED[1], OUTPUT);
  pinMode(LED[2], OUTPUT);
  pinMode(LED[3], OUTPUT);
 
  Serial.begin(57600);
}

void loop()
{
  if(Serial.available()>0)
  {
    stan = Serial.read();
   
    stan = stan - 48;
   
    digitalWrite(LED[4], HIGH);
    delay(100);
    digitalWrite(LED[4], LOW);
   
    if(stan==0)
    {
      digitalWrite(LED[0], LOW);
      digitalWrite(LED[1], LOW);
      digitalWrite(LED[2], LOW);
      digitalWrite(LED[3], LOW);
    }
   
    if(stan==1)
    {
      digitalWrite(LED[0], HIGH);
      digitalWrite(LED[1], LOW);
      digitalWrite(LED[2], LOW);
      digitalWrite(LED[3], LOW);
    }
   
    if(stan==2)
    {
        digitalWrite(LED[0], HIGH);
        digitalWrite(LED[1], HIGH);
        digitalWrite(LED[2], LOW);
        digitalWrite(LED[3], LOW);
    }
   
    if(stan==3)
    {
        digitalWrite(LED[0], HIGH);
        digitalWrite(LED[1], HIGH);
        digitalWrite(LED[2], HIGH);
        digitalWrite(LED[3], LOW);
    }
   
    if(stan==4)
    {
        digitalWrite(LED[0], HIGH);
        digitalWrite(LED[1], HIGH);
        digitalWrite(LED[2], HIGH);
        digitalWrite(LED[3], HIGH);
    }
  }
 
  Serial.println(stan);
 
  delay(1000);
}


Błędu dopatruję się raczej w Ard.cpp, a konkretniej w metodzie wysyłania wartości. Zapewne związany jest on z tym, że wartość wysyłana jest ze zmiennej typu int, a nie ze Stringa. Prawdopodobnie może mieć też na to wpływ użycie cout.

Tak więc pytanie jest następujące. Gdzie w kodzie znajduje się błąd i w jaki sposób go naprawić?
kijek
 
Posty: 4
Dołączył(a): 24.08.2010 (Wt) 14:36
System: Windows 7 HP
    Windows 7 Firefox

Powrót do C/C++ i pochodne

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości

cron