Jetzt möchte ich mal zeigen wie man sich mit dem AutoMower unterhalten kann.
Der AutoMower hat ja eine Diagschnittstelle. Das ist eine RS232 aber mit 3.3 Volt. Den Schaltplan für den Pegelwandler findet man Hier: https://www.roboternetz.de/phpBB2/vi...?p=97409#97409
Es geht aber auch anders. Die FM-Transceiver-Modul (RT868F4) von www.robotikhardware.de arbeiten ebenfalls mit 3.3 Volt. Es spricht nichts gegen eine direkten Anschluss. Auf der PC-Seit benutze ich das gleiche Transceiver-Modul auf der RN-Funk Platine.
Das Protokoll des AutoMower ist:
Anfrage an den AM:
----------------------------
Byte 1: 0F Hex ; ist immer so.
Byte 2 und 3: die Adresse der AM-Variable.
Byte 4 und 5: sind normalerweise 0, bei einigen StringVariablen als Index.
----------------------------
Der AM antwortet dann:
Byte 1: 0F Hex
Byte 2 und 3: die angefragte Adresse.
Byte 4 und 5: Die gelesenen Daten.
----------------------------
Hier mal ein Beispiel:
-----------------------------------
Connected to "Kommunikationsanschluss (COM1)"
Request: 18.05.2006 10:52:04.46664
0F 46 50 00 00 .FP..
Answer: 18.05.2006 10:52:04.48264 (+0.0156 seconds)
0F 46 50 E8 03 .FPè.
Request: 18.05.2006 10:52:04.48264 (+0.0000 seconds)
0F 46 52 00 00 .FR..
Answer: 18.05.2006 10:52:04.49764 (+0.0156 seconds)
0F 46 52 29 5C .FR)\
Request: 18.05.2006 10:52:04.49764 (+0.0000 seconds)
0F 46 54 00 00 .FT..
Answer: 18.05.2006 10:52:04.51364 (+0.0000 seconds)
0F 46 54 00 00 .FT..
Request: 18.05.2006 10:52:04.51364 (+0.0000 seconds)
0F 46 56 00 00 .FV..
Answer: 18.05.2006 10:52:04.52964 (+0.0156 seconds)
0F 46 56 0B 00 .FV..
Request: 18.05.2006 10:52:04.52964 (+0.0000 seconds)
0F 46 58 00 00 .FX..
Answer: 18.05.2006 10:52:04.54464 (+0.0156 seconds)
0F 46 58 E1 10 .FXá.
-----------------------------------
Mein Test-Programm in Visual-Basic
Code:
Option Explicit
Dim a, b, dtr, rts, LogNum, PrStat, iEingabe As Integer
Dim iFileNumber As Integer
Dim sPath As String
Private Sub Ch_Bat_Click()
If Ch_Bat.Value Then
Bat_I.BackColor = vbWhite
Bat_U.BackColor = vbWhite
Else
Bat_I.BackColor = &H8000000F
Bat_U.BackColor = &H8000000F
End If
End Sub
Private Sub Ch_Cutt_Click()
If Ch_Cutt.Value Then
Cutt_Sp.BackColor = vbWhite
Cutt_I.BackColor = vbWhite
Else
Cutt_Sp.BackColor = &H8000000F
Cutt_I.BackColor = &H8000000F
End If
End Sub
Private Sub Ch_Logfile_Click()
If Ch_Logfile.Value Then
Ch_Logfile.ForeColor = vbRed
LogNum = LogNum + 1
sPath = App.path & "\" & "Log_" & Trim(Str(LogNum)) & ".txt"
Open sPath For Output As #iFileNumber
' Print #iFileNumber,
' Print #iFileNumber, "Text1.Text"
Else
Ch_Logfile.ForeColor = vbBlack
Close #iFileNumber
End If
End Sub
Private Sub Ch_Motor_Click()
If Ch_Motor.Value Then
Mot_Li.BackColor = vbWhite
Mot_Re.BackColor = vbWhite
Else
Mot_Li.BackColor = &H8000000F
Mot_Re.BackColor = &H8000000F
End If
End Sub
Private Sub Ch_Protokoll_Click()
If Ch_Protokoll.Value Then
Log_Dez.BackColor = vbWhite
Log_Hex.BackColor = vbWhite
Else
Log_Dez.BackColor = &H8000000F
Log_Hex.BackColor = &H8000000F
End If
' Debug.Print "bLog:="; bLog
End Sub
Private Sub Ch_Start_Click()
Timer1.Interval = 5000
If Ch_Start.Value Then
Ch_Start.ForeColor = vbRed
Ch_Start.Caption = "Stop"
Timer1.Enabled = True
Else
Ch_Start.ForeColor = vbBlack
Ch_Start.Caption = "Start"
Timer1.Enabled = False
End If
End Sub
Private Sub Ch_Uhr_Click()
If Ch_Uhr.Value Then
Ch_Uhr.ForeColor = vbRed
Ch_Uhr.Caption = "Uhr Stop"
Else
Ch_Uhr.Caption = "Uhr Start"
Ch_Uhr.ForeColor = vbBlack
End If
End Sub
Private Sub Eingabe_Click()
iEingabe = Val(Eingabe.Text)
Form1.Eingabe.Visible = True 'Antwortfeld anzeigen
Form1.Eingabe.SetFocus 'Cursor ins Textfeld setzen
Me.KeyPreview = True
End Sub
Private Sub Lehrmachen_Click()
Log_Dez.Text = ""
Log_Hex.Text = ""
End Sub
Private Sub Cmd_ComSetup_Click()
Load Form2
Form2.Show
End Sub
Private Sub Form_Load()
' Einstellungen aus der Datei laden
Me.Left = GetPrivateProfileInt("Fenster", "linkerRand", 200, App.path & "\" & "optionen.ini")
Me.Top = GetPrivateProfileInt("Fenster", "obererRand", 100, App.path & "\" & "optionen.ini")
LogNum = GetPrivateProfileInt("Log", "LogNum", 0, App.path & "\" & "optionen.ini")
a = GetPrivateProfileInt("Comm", "Settings", 9600, App.path & "\" & "optionen.ini")
b = GetPrivateProfileInt("Comm", "PortNr", 1, App.path & "\" & "optionen.ini")
Form2.Combo4.ListIndex = b
rts = GetPrivateProfileInt("Comm", "RTSEnable", 1, App.path & "\" & "optionen.ini")
dtr = GetPrivateProfileInt("Comm", "DTREnable", 1, App.path & "\" & "optionen.ini")
If b <> 0 Then
If MSComm1.PortOpen = False Then 'if comport is disabled....
' ComSetup.Caption = "COM " & b & " " & a
MSComm1.CommPort = b
MSComm1.Settings = a
MSComm1.RThreshold = 1
MSComm1.DTREnable = dtr
MSComm1.RTSEnable = rts
MSComm1.PortOpen = True ' enable it.
Form1.Cmd_ComSetup.Caption = "COM" & Trim(Str$(Form1.MSComm1.CommPort)) & ", " & Form1.MSComm1.Settings
End If
End If
iFileNumber = FreeFile
'sPath = App.path & "\" & "LogFile.txt"
End Sub
Private Sub Form_Unload(Cancel As Integer)
WritePrivateProfileString "Fenster", "linkerRand", Str$(Me.Left), App.path & "\" & "optionen.ini"
WritePrivateProfileString "Fenster", "obererRand", Str$(Me.Top), App.path & "\" & "optionen.ini"
WritePrivateProfileString "Log", "LogNum", Str$(LogNum), App.path & "\" & "optionen.ini"
'If MSComm1.PortOpen = True Then
WritePrivateProfileString "Comm", "Settings", MSComm1.Settings, App.path & "\" & "optionen.ini"
WritePrivateProfileString "Comm", "PortNr", Str$(MSComm1.CommPort), App.path & "\" & "optionen.ini"
WritePrivateProfileString "Comm", "DTREnable", Str$(dtr), App.path & "\" & "optionen.ini"
WritePrivateProfileString "Comm", "RTSEnable", Str$(rts), App.path & "\" & "optionen.ini"
If Form1.MSComm1.PortOpen Then Form1.MSComm1.PortOpen = False
'End If
If Ch_Logfile.Value Then Close #iFileNumber
Unload Form2
End Sub
Private Sub Timer1_Timer()
Dim iTemp As Integer
Dim sTemp As String
If Ch_Logfile.Value Then Print #iFileNumber, Date & " " & Time();
If iEingabe > 0 Or iEingabe > 50000 Then
If SendBefehl(iEingabe, 0, 3, iTemp) Then Ergebnis = Str$(iTemp) & " - " & Hex$(iTemp)
End If
If Ch_Uhr.Value Then
If SendBefehl(14013, 0, 1, iTemp) Then sTemp = Right$(Str$(100 + iTemp), 2) & "."
If SendBefehl(14009, 0, 1, iTemp) Then sTemp = sTemp & Right$(Str$(100 + iTemp), 2) & "."
If SendBefehl(14007, 0, 1, iTemp) Then sTemp = sTemp & Right$(Str$(100 + iTemp), 2) & " "
If SendBefehl(14005, 0, 1, iTemp) Then sTemp = sTemp & Right$(Str$(100 + iTemp), 2) & ":"
If SendBefehl(14003, 0, 1, iTemp) Then sTemp = sTemp & Right$(Str$(100 + iTemp), 2) & ":"
If SendBefehl(14001, 0, 1, iTemp) Then sTemp = sTemp & Right$(Str$(100 + iTemp), 2)
Uhrzeit = sTemp
End If
If Ch_Bat.Value Then
If SendBefehl(491, 0, 3, iTemp) Then Bat_I = Str$(iTemp)
If SendBefehl(12020, 0, 3, iTemp) Then Bat_U = Str$(iTemp)
If SendBefehl(12030, 0, 3, iTemp) Then Bat_U = Bat_U & " - " & Str$(iTemp)
If SendBefehl(12000, 0, 3, iTemp) Then Bat_AH = Str$(iTemp)
If SendBefehl(495, 0, 3, iTemp) Then Bat_AH = Bat_AH & " - " & Str$(iTemp)
If SendBefehl(563, 0, 3, iTemp) Then Bat_Temp = Str$(iTemp)
If SendBefehl(565, 0, 3, iTemp) Then Bat_TempL = Str$(iTemp)
End If
If Ch_Cutt.Value Then
If SendBefehl(12010, 0, 3, iTemp) Then Cutt_Sp = Str$(iTemp)
If SendBefehl(4750, 0, 1, iTemp) Then Cutt_I = Str$(iTemp)
If SendBefehl(557, 0, 1, iTemp) Then Cutt_I = Cutt_I & " - " & Str$(iTemp)
End If
If Ch_Motor.Value Then
If SendBefehl(9408, 0, 1, iTemp) Then Mot_Li = Str$(iTemp)
If SendBefehl(410, 0, 1, iTemp) Then Mot_Li = Mot_Li & " - " & Str$(iTemp)
If SendBefehl(9407, 0, 1, iTemp) Then Mot_Re = Str$(iTemp)
If SendBefehl(409, 0, 1, iTemp) Then Mot_Re = Mot_Re & " - " & Str$(iTemp)
End If
If SendBefehl(497, 0, 3, iTemp) Then Status = Right$("0000" & Hex$(iTemp), 8)
If Ch_Logfile.Value Then Print #iFileNumber,
End Sub
Public Function SendBefehl(Adresse As Integer, SubAdr As Integer, typ As Byte, ByRef Daten As Integer) As Boolean
Dim i, j, n As Long
Dim dat, adr As Long
Dim sData() As Byte
SendBefehl = False
For j = 1 To 10
PrStat = 0
adr = 0
dat = 0
MSComm1.Output = Chr$(&HF) _
& Chr$(HiByte(Adresse)) _
& Chr$(LoByte(Adresse)) _
& Chr$(HiByte(SubAdr)) _
& Chr$(LoByte(SubAdr))
DoEvents
n = 0
Do
n = n + 1
If n > 50000 Then
Exit Do
End If
sData = MSComm1.Input
For i = 0 To UBound(sData())
' Debug.Print "i:="; i; j; n; PrStat; sData(i); adr; dat
Select Case PrStat
Case 4
If (typ And &H2) Then dat = Bytes2Word(sData(i), dat)
PrStat = 5
Case 3
If (typ And &H1) Then dat = sData(i)
PrStat = 4
Case 2
adr = (adr * CLng(256)) + sData(i)
PrStat = 3
Case 1
adr = sData(i)
PrStat = 2
Case 0
If sData(i) = &HF Then PrStat = 1
Case Else
PrStat = 0
adr = 0
dat = 0
End Select
Next i
Loop Until PrStat = 5
If adr = Adresse Then
SendBefehl = True
Exit For
Else
Beep
End If
Next j
Daten = dat
' Debug.Print "n:="; n; Adresse; Daten; typ
If Ch_Protokoll.Value Then
Log_Dez.Text = Log_Dez.Text & Str$(Adresse) & "," & Str$(Daten) & Chr(13) & Chr(10)
Log_Hex.Text = Log_Hex.Text & Hex$(Adresse) & "," & Hex$(Daten) & Chr(13) & Chr(10)
End If
If Ch_Logfile.Value Then Print #iFileNumber, "," & Str$(Daten);
End Function
Oder, für mich noch besser, ein Testprogramm in PocketC um mit dem Pocket-PC sich das anzuschauen.
Code:
#include "/pocketc/pcheader.h"
int wind_event, ret;
int Status, Rx_Stat = 0;
char zz, cc;
int SendBefehl(int a, int sa, char typ, int &d) {
int i,j;
int t;
int dat =0, adr =0;
t = (typ & 0x3);
//putsl("a :"+ (int)a +" hi:" + ((int)a>>8) + " lo:" + (int)(a & 0xff));
//putsl("sa :"+ (int)sa +" hi:" + ((int)sa>>8) + " lo:" + (int)(sa & 0xff));
for (i = 0; i < 2; i++) {
writebyte(ret, (char)0xf);
writebyte(ret, (char)a>>8);
writebyte(ret, (char)a);
writebyte(ret, (char)sa>>8);
writebyte(ret, (char)sa);
j = 3;
Rx_Stat = 0;
do{
commwait(ret,0);
wind_event = event(1);
sleep(0);
switch(wind_event) {
case PM_COMMEVENT: { // Serial Port
do {
cc = readbyte(ret);
// putsl("1 Rx_Stat:"+ Rx_Stat +" j:"+j +" cc:"+(int)cc);
switch(Rx_Stat) {
case 0: {
if ((int)cc == 0x0f) Rx_Stat = 1;
break;
}
case 1: {
Rx_Stat = 2;
adr = ((int)cc) <<8 ;
break;
}
case 2: {
Rx_Stat = 3;
adr = (adr & 0xff00)|(int)cc;
break;
}
case 3: {
Rx_Stat = 4;
if (t & 0x1) dat = (int)cc;
break;
}
case 4: {
Rx_Stat = 5;
if (t == 0x3){
dat = cc << 8 | dat;
}
if (t == 0x2) dat = cc;
break;
}
default: {
Rx_Stat = 0;
adr = 0;
dat = 0;
break;
}
} // switch(Rx_Stat)
}while(Rx_Stat !=5)
break;
}
case PM_CHAR:{ // Keyboard
zz = key();
puts((int)zz);
break;
}
case PM_NONE: break;
case PM_TIMER: {
j--;
break;
}
} // switch(wind_event)
} while ((j > 0) && (Rx_Stat != 5))
// putsl("1 adr:"+(int)adr+" dat:"+(int)dat);
// putsl("2 Rx_Stat:"+ Rx_Stat +" j:"+j +" cc:"+(int)cc);
if (a == adr) {
if (dat > 32768) d = ( dat | 0xffff0000) ;
else d = dat;
if (j) return 1;
}
} // for i
// putsl("fehler j:"+(int)j+" Rx_Stat:"+(int)Rx_Stat);
return 0;
}
main() {
int i,iTmp;
int Daten;
int nTimerID;
int Cur_x =0;
int BIalt[2] = {0,170};
clear(); // Bildschirm löschen
// showconsole();
nTimerID = settimer(1,200); // 200ms Timer
putsl("AutoMower Comm");
ret = seropen(9600,"8N1N",1000);
putsl("seropen:" + ret);
if (!ret) {
alert("Fehler beim öffnen von COM1:");
quit();
}
commsetmask(ret,EV_RXCHAR);
/* ein test für das typ Flag
ausgabe auf der Console */
SendBefehl(497,0,0,Daten) ;// Status
puts("0-NUL:"+Daten+ ", ");
SendBefehl(497,0,1,Daten) ;// Status
puts("1--lo:"+Daten+ ", ");
SendBefehl(497,0,2,Daten) ;// Status
puts("2--hi:"+Daten+ ", ");
SendBefehl(497,0,3,Daten) ;// Status
putsl("3-int:"+Daten);
rect(0,70,240,270);
rect(1,1,239,68);
/* Akkuwerte */
text(4,2,"Status:");
text(150,2,"Bat_mAh:");
text(4,18,"Bat_T:");
text(80,18,"Bat_I:");
text(160,18,"Bat_U:");
/* Induktions-Schleife */
text(4,34,"L_A0:");
text(85,34,"L_N7:");
text(165,34,"L_F9:");
/* Motoren */
text(4,50,"M_Mä:");
text(85,50,"M_Ml:");
text(165,50,"M_Mr:");
for (i = 0;i < 5000; i++) {
Cur_x = (i/5) % 240;
/* Akku-Strom laden/entladen */
settextcolor(0,255,255);
setpenattr(0,1,0,255,255);
if (SendBefehl(491,0,3,Daten)) { // Bat I
text(120,18,Daten+ " ");
iTmp = 170-(Daten/25);
// iTmp=170;
line(BIalt[0],BIalt[1],Cur_x,iTmp);
BIalt[0] = Cur_x;
BIalt[1] = iTmp;
}
/* Akku-Spannung in mVolt */
settextcolor(0,255,0);
setpixelattr(0,255,0);
if (SendBefehl(12030,0,3,Daten)){ // Bat U
text(200,18,Daten+ " ");
setpixel(Cur_x,265-((Daten-1500)/125));
}
/* Akku-ladung in mAh */
settextcolor(0,0,255);
setpixelattr(0,0,255);
if (SendBefehl(12000,0,3,Daten)){ // mAh
text(205,2,Daten+ " ");
setpixel(Cur_x,265-(Daten/15));
}
/* Akku-Temperatur */
settextcolor(255,0,0);
setpixelattr(255,0,0);
if (SendBefehl(563,0,3,Daten)) {// Temperatur
text(45,18,Daten+ " ");
setpixel(Cur_x,265-(Daten*3));
}
setpixelattr(0,0,0);
settextcolor(0,0,0);
/* Mäher-Status */
if (SendBefehl(497,0,3,Daten)) // Status
text(45,2,Daten+ ", ");
/* BegrenzungsSchleife */
if (SendBefehl(424,0,3,Daten)) // A0
text(40,34,Daten+ " ");
/* Ladestation Nah-Signal */
if (SendBefehl(426,0,3,Daten)) //N7
text(120,34,Daten+ " ");
/* Ladestation Fern-Signal */
if (SendBefehl(427,0,3,Daten)) // F9
text(195,34,Daten+ " ");
/* Motor- Mähwerk in rpm */
if (SendBefehl(12010,0,3,Daten))
text(40,50,Daten+ " ");
/* Motor- Links in rpm */
if (SendBefehl(9408,0,3,Daten))
text(120,50,Daten+ " ");
/* Motor- Rechts */
if (SendBefehl(9407,0,3,Daten))
text(195,50,Daten+ " ");
sleep(1);
} // for
killtimer(nTimerID);
fileclose(ret);
// return 0;
alert("is fetich");
quit();
}
Lesezeichen