PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ASURO Fernsteuerung mit Linux



stochri
05.01.2006, 20:00
Hallo Miteinander
Für die Fernstuerung des Asuro schien mir folgender Weg am einfachsten:

echo 1 > /dev/ttyUSB0

Damit wird eine 1 an den Asuro via USB-Adapter gesendet und der Asuro bewegt sich einen Schritt vorwärts.
Als Kommandos habe ich einfach die Zahlen von 1 bis 4 für alle Richtungen verwendet.
Das ganze läßt sich in ein Script verpacken.


#!/bin/bash
echo 4 > /dev/ttyUSB0
Jetzt kann man den asuro aus der Kommandozeile mit ./asuro_vor steuern.

Bis jetzt muss ich allerdings immer noch mindesten einmal minicom aufrufen, damit es mir die richtigen Schnittstellenparameter einstellt. Kann mir vielleicht jemand sagen wie das ganze mit setserial aussehen muss?

Hier noch das ASURO-Programm, falls noch jemand den Roboter über Linux steuern will:

#include "asuro.h"
/************************************************** ***********************

Asuro Remote Control by Linux

To controll the robot you can use minicom.
The following keys are defined:

'1': vorward
'2': backward
'3': turn left
'4': turn right

You may also send a comand by the linux shell:
(e.g. go vorward )
echo 1 > /dev/ttyUSB0

make shure that the tty-parameters are set to 24008N1 no handshake

Vers.: 1.0

5.1.2006 stochri

************************************************** ************************/
typedef unsigned char byte;

#define aus MotorDir(BREAK,BREAK)

byte chgetchar()
{
UCSRB = 0x10; // enable receiver
while(!(UCSRA & 0x80)); // wait for received byte
return UDR;
}


void main()
{
byte command,n;

Init();
SerWrite("\n\r-- ASURO-Linux-Com --\n\r",25);

MotorSpeed(160,160);
aus;

while(1)
{
/* Warten auf ein Kommando der seriellen Schnittstelle */

command = chgetchar();

switch(command)
{
case '1':
{
MotorDir(FWD,FWD);
Msleep(100);
aus;
}
break;
case '2':
{
MotorDir(RWD,RWD);
Msleep(100);
aus;
}
break;
case '3':
{
MotorDir(RWD,FWD);
Msleep(50);
aus;
}
break;
case '4':
{
MotorDir(FWD,RWD);
Msleep(50);
aus;
}
break;
default:
{
}break;
}
}
return 0;
}

/************************************************** *************************
*
* (c) 2006 stochri
*
************************************************** *************************
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* any later version. *
************************************************** *************************/


Gruss,
stochri

stochri
05.01.2006, 21:15
Die ganze Aktion dient folgendem Zweck:

https://www.roboternetz.de/phpBB2/viewtopic.php?t=15731

Der Asuro soll über eine Kamera ferngesteuert werden.

Gruss,
stochri

izaseba
05.01.2006, 21:43
Kann mir vielleicht jemand sagen wie das ganze mit setserial aussehen muss?

schau Dir stty an und genau die Ausgabe von stty -a < /dev/(Dein Device)
bevor, und nachdem Du minicom ausgeführt hast.
Das wichtigste ist speed:

was kommt nach setserial -g /dev/(Dein Device)
UART: 16550A bzw. 16550 ?
wenn nicht so setzen.

schau Dir das auch mal an : Modem-Howto (http://www.linuxhaven.de/dlhp/HOWTO/DE-Modem-HOWTO-8.html#ss8.4)

Gruß Sebastian

stochri
05.01.2006, 21:52
ww@Bigtower:~> stty -a </dev/ttyUSB0
speed 2400 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 5;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt
-echoctl -echoke

Muss der ganze Rattenschwanz an setserial übergeben werden ?

Gruss,
stochri

izaseba
05.01.2006, 22:06
1. nicht an setserial sondern an stty
stty -F /dev/ttyUSB0 ospeed 2400 setzt Du Baudrate auf 2400
2. Das meiste brauchst Du eher nicht Baudrate würde ev. reichen schaumal stty --help | more um alle Parameter anzuzeigen.

Ich hoffe das es damit klappt.

Gruß Sebastian

stochri
07.01.2006, 07:20
Hallo Izazeba,
jetzt habe ich einfach mal die obige Zeile von Dir

stty -F /dev/ttyUSB0 ospeed 2400 in ein Scriptfile gepackt und lasse es von SCILAB bei der Initialisierung ausführen. Die Kommunikation klappt dann. Ist zwar ein bischen "murksig" falls ein anderes Programm vorher noch ein paar andere Parameter verdreht hätte, aber solange es funktioniert, kann es ja mal so bleiben.

Vielen Dank für Deine Hilfe,
stochri

izaseba
07.01.2006, 10:57
Hallo Stochri,
es freut mich, daß es klappt.
Es ist eher unwahrscheinlich, daß ein anderes Programm noch was "verdreht",
die Baudrate ist der Parameter, der am wichtigsten ist und am meisten vom Programm zu Programm variert.
Das einzigste Programm, daß mir noch die Serielle veränderte, ist lirc es braucht den Parameter UART = none, ich muß Sie anschließend mit setserial auf 16550A einstellen.Das ist aber nicht weiter schlimm, wozu gibt es ja die Scripte ... :-b
Eine Andere Lösung ist, ein kleines C Programm zu schreiben, wo man die Serielle mit allen Parametern öffnet und wieder schließt.
Wenn es aber mit stty klappt, ist es wohl nicht notwendig.

Viel Spaß mit Deinem Projekt, es interessiert mich wirlich, was daraus wird.

Gruß Sebastian