Einzelnen Beitrag anzeigen

NiNj4sTy1e

Registriert seit: 22. Dez 2008
10 Beiträge
 
Delphi 7 Personal
 
#1

RGB Farbwerte an einen Mikrocontroller senden

  Alt 7. Apr 2011, 17:44
Hallo liebe Delphi Gemeinde,

ich hoffe ihr könnt mir bei meinem Problem weiterhelfen und ich hoffe das Thema ist im richtigen Unterforum erstellt

Also mein Vorhaben ist einfach: In Delphi RGB-Farbwerte einstellen/ermitteln per ScrollBar oder Farbkreis, das ist auch kein Problem.
Diese Daten dann als String an einen Mikrocontroller senden, dieser steuert dann eine RGB Leuchtdiode an (werden später mehr).
Der Mikrocontroller ist ein Atmel ATMEGA328P fertig auf eine Platine gelötet als Arduino und hängt am USB.
Für den Arduino habe ich auch schon einen fertigen Code aus dem Internet, dieser funktioniert leider nur mit dem Interface, das der Verfasser in Processing(Java) geschrieben hat.

Ich möchte den Controller allerdings mit Delphi ansprechen. Ein einfaches 'L' um eine LED anzuschalten bzw. ein 'H' um sie auszuschalten konnte ich schon an den Controller senden. Mit TComport das hat der Arduino verstanden, aber wenn ich die dreistelligen RGB Werte sende geht irgendwas schief...

Ich weiß echt nicht mehr weiter, habe leider auch nicht so viel Erfahrung mit sowas. Ca. 30 Stunden Internetsuche haben mein Problem nicht lösen können.

Jetzt folg erstmal eine ganze Menge Code zur Verdeutlichung:

Das ist erstmal der Processing Code, den der Andere benutzt hat, um RGB Farbwerte zu ermitteln und an den Arduino zu schicken:

Das wichtigste im Code ist aber ganz unten hier nochmal extra:
Code:
myPort.write('L');

myPort.write(r);

myPort.write(g);

myPort.write(b);


Code:
import processing.serial.*;

Serial myPort;

PFont font;

int r = 0;

int g = 0;

int b = 0;

void setup() {

size(512, 512);

println(Serial.list());

String portName = Serial.list()[1];

myPort = new Serial(this, portName, 9600);
font = loadFont("AngsanaNew-Bold-48.vlw");

}

void draw() {

background(0, 0, 0);

smooth();

stroke(50, 50, 50);

fill(r, g, b);

rectMode(CORNERS);

rect(20, 20, width / 2 - 10, height - 20);

textFont(font);

textAlign(CENTER, TOP);

text("COLOR!", width - width / 4 - 5, 20);

textAlign(LEFT);

fill(r, 0, 0);

text("R: ", width - width / 2, 292);

textAlign(RIGHT);

text(r, width - 10, 292);

textAlign(LEFT);

fill(0, g, 0);

text("G: ", width - width / 2, 392);

textAlign(RIGHT);

text(g, width - 10, 392);

textAlign(LEFT);

fill(0, 0, b);

text("B: ", width - width / 2, 492);
textAlign(RIGHT);

text(b, width - 10, 492);

g = mouseX / 2;

b = mouseY / 2;

if ((mousePressed == true) && (mouseButton == LEFT) && (r < 251)) {

r += 5;

}

if ((mousePressed == true) && (mouseButton == RIGHT) && (r > 4)) {

r -= 5;

}

myPort.write('L');

myPort.write(r);

myPort.write(g);

myPort.write(b);

}
Das hier ist der Code der auf dem Arduino die Werte empfängt und die Farbe an die RGB LED gibt:

Code:
byte r = 0;

byte g = 0;

byte b = 0;

byte r_pin = 9;

byte g_pin = 10;

byte b_pin = 11;

void setup() {

Serial.begin(9600);

}

void loop() {

if (Serial.available() == 4) {

if (Serial.read() == 'L') {

r = Serial.read();

g = Serial.read();

b = Serial.read();

}

}

analogWrite(r_pin, r);

analogWrite(g_pin, g);

analogWrite(b_pin, b);

}
wichtig hierbei:
Code:
Serial.begin(9600);

}

void loop() {

if (Serial.available() == 4) {

if (Serial.read() == 'L') {

r = Serial.read();

g = Serial.read();

b = Serial.read();

}
So zu guter letzt der Delphi Code mit dem ich eigentlich das machen will, was der Processing Code macht:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, CPortCtl, CPort, StdCtrls;

type
  TForm1 = class(TForm)
    ComPort1: TComPort;
    ComDataPacket1: TComDataPacket;
    Button1: TButton;
    Button2: TButton;
    Button4: TButton;
    ScrollBar1: TScrollBar;
    ScrollBar2: TScrollBar;
    ScrollBar3: TScrollBar;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure ScrollBar1Change(Sender: TObject);
    procedure ScrollBar2Change(Sender: TObject);
    procedure ScrollBar3Change(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  r,g,b:integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ComPort1.ShowSetupDialog;
end;


procedure TForm1.Button4Click(Sender: TObject);
begin
begin
  if ComPort1.Connected then
    ComPort1.Close
  else
    ComPort1.Open;
end;
end;

procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
r:=ScrollBar1.Position;
Label1.Caption:=Inttostr(r);
end;

procedure TForm1.ScrollBar2Change(Sender: TObject);
begin
g:=ScrollBar2.Position;
Label2.Caption:=Inttostr(g);
end;

procedure TForm1.ScrollBar3Change(Sender: TObject);
begin
b:=Scrollbar3.Position;
Label3.Caption:=IntToStr(b);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ComPort1.WriteStr('L');
ComPort1.WriteStr(Inttostr(r));
ComPort1.WriteStr(Inttostr(g));
ComPort1.WriteStr(Inttostr(b));
end;

end.
Sind einfach 3 ScrollBars an denen ich die Werte für R G B einstelle und dann diese an den Controller sende, was nicht funktioniert

Ich hoffe irgendjemand kann mir weiterhelfen. Glaubt bitte nicht ich hätte es nicht selber versucht, aber bin relativ neu in Delphi, in einem anderem Forum, das sich aber eher mit Leuchtdioden beschäftigt meinte jemand es wäre vielleicht besser die Werte als Array zu schicken?
Wie gesagt der Arduino Code geht der Fehler liegt halt daran wie die Daten in Delphi gesendet werden.

Der Gedanke diesen Codebrocken einfach so nachzubauen ohne viel Aufwand, war leider ein Irrtum

Code:
myPort.write('L');

myPort.write(r);

myPort.write(g);

myPort.write(b);
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
ComPort1.WriteStr('L');
ComPort1.WriteStr(Inttostr(r));
ComPort1.WriteStr(Inttostr(g));
ComPort1.WriteStr(Inttostr(b));
end;

SRY für den Roman,

und Danke schonmal.
Hier nochmal der Link ins LED Forum wo ich auch schon nachgefragt hatte:http://www.ledstyles.de/ftopic16488.html

EDIT: Achso ich verwende (leider) Delphi 7

Geändert von NiNj4sTy1e ( 7. Apr 2011 um 17:48 Uhr)
  Mit Zitat antworten Zitat