-
Hey William,
sag mal weist du oder könntest du mal messen was die elektronik, außer motoren, an strom zieht? bin am überlegen ob man nicht einen kleinen 5Volt schaltregler aufbaut und die 3,3Volt von einem festspannungsregler der an dem schaltregler hängt erzeugt. denke das sollte effizienter sein!?
ich will auch mal versuche deine platine so umzuändern das man auch ohne arduino hinkommt. also das man die bauteile selber bestücken kann. spart sicher nochmal ein paar gramm. soll aber trotzdem noch so sein dass, das arduino aufgesetzt werden kann.
EDIT:
ich habe gerade mal nen bisl rum gesurft und auf sparkfun habe ich auch den drucksensor gefunden. mit breakout board und ohne. ohne soll der sensor knapp 9Dollar kosten und lötbar ist dieser auchnoch. evtl könnte goara auf seinem PCB layout dies auchnoch berücksichtigen das man ihn evtl so auflötet.
gruß, Bammel
-
Hi Sven,
ich glaube die Schaltung der Tricopterplatine zieht ca. 50mA. Hängt aber stark davon ab was man für einen Empfänger benutzt. Bei den Platinenänderungen/ Sensoränderungen denk aber da dran, dass das ganze so aufgebaut ist, weil ich den Nachbau so einfach wie möglich machen wollte. Klaro könnte ich einfach einen Mega328p auf die Platine setzen, aber es gibt viele Menschen die TQFP-löten scheuen. Außerdem ist die Benutzung eines Bootloaders einfach sehr praktisch und simpel. Viele Leute die den Tricopter nachbauen haben keine Ahnung von Elektronik, aber wenn man meine Anleitung liest, und die Komponenten benutzt die ich vorschlage, braucht man auch keine Ahnung zu haben. Je spezieller und komplizierter der Aufbau/ das Löten wird, desto weniger interessant wird mein Tricopter.
Für eure eigenen Weiterentwicklungen könnt ihr natürlich machen was ihr wollt, aber wenn es für potentielle Nachbauer verwendbar sein soll, muss alles so einfach wie möglich sein
-
Ja ich habe mir eben noch viele gedanken gemacht und die layouts angesehen. und bin doch zum entschluss gekommen der copter erstmal so nach deinen komponenten aufzubauen. den so funktioniert es schließlich. ich werde auch nicht den dreiachs-acc benutzen sondern den von dir verwendeten zweiachs. da dieser ja mit 5 volt betrieben werden kann.
zudem hätten wir dann von der elektronik einen identischen copter mit dem man zusammen weiterentwickeln kann.
-
Ich habe mal mit dem GPS angefangen. Viel Zeit hatte ich allerdings noch nicht. Her der Code, der mir die Koordinaten per Funk auf den Laptop sendet:
Code:
'===CHIP SETTINGS===
$regfile = "m328pdef.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000
$baud = 38400
Dim Serialdata As String * 120
Dim Newval As Bit
Dim State As Byte
Dim Gpgga(12) As String * 10
Dim Splitcounter As Byte
Config Input0 = Crlf , Echo = Crlf
Config Serialin = Buffered , Size = 120 , Bytematch = 10
Config Serialout = Buffered , Size = 120
Config Pinb.5 = Output
Clear Serialin
Waitms 1000
Print "go"
Enable Interrupts
Do
If Newval = 1 Then
Reset Newval
If Left(serialdata , 6) = "$GPGGA" Then
Splitcounter = Split(serialdata , Gpgga(1) , ",")
Toggle Portb.5
End If
Print Gpgga(3) ; " - " ; Gpgga(4) ; " , " ; Gpgga(5) ; " - " ; Gpgga(6) ; " quality:" ; Gpgga(7) ; " satellites: " ; Gpgga(8)
State = Val(gpgga(7))
If State = 1 Then
Portb.5 = 1
End If
End If
Loop
Serial0charmatch:
Input Serialdata , Noecho ' , Noecho
Newval = 1
Return
Ich möchte als nächstes gerne eine feste Koordinate einstellen, und dann die Differenz (in metern) der gemessenen GPS position zur voreingestellten Position berechnen. Damit möchte ich herausfinden wie genau die Messungen überhaupt sind.
Es wäre gut wenn jeder der mitarbeitet seine Fortschritte postet damit keine Arbeit doppelt gemacht wird...
-
Jetzt habe ich auch den HMC6352 Kompass getestet (code aus dem Mood pill projekt):
Code:
'===CHIP SETTINGS===
$regfile = "m328pdef.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000
$baud = 38400 ' use a low baudrate, if you use internal RC-clock
$lib "i2c_twi.lbx" ' we do not use software emulated I2C but the TWI
Waitms 1000 ' give Compass some time to stabilize
' I2C-Slave-Address of the HMC6352 Digital Compass Module and Configuration values
Const Compass_address = &H42
Dim Compass_w_array(3) As Byte
Compass_w_array(1) = &H47 ' "G"-Command: write to RAM
Compass_w_array(2) = &H74 ' RAM Address H74: Operational Mode
Compass_w_array(3) = &B01110000 ' 20Hz, Set/Reset=yes, Standby mode
' Compass value read variables
Dim Compass_r_array(2) As Byte ' Byte array for the two bytes of heading value
Dim Compass_value As Word At Compass_r_array(1) Overlay ' WORD variable for the heading value
Config Scl = Portc.5 ' we need to provide the SCL pin name
Config Sda = Portc.4 ' we need to provide the SDA pin name
I2cinit ' we need to set the pins in the proper state
'use a bps rate lower than 100000, if your µC-clock-speed is
'below approx. 4 MHz
Config Twi = 100000 ' wanted clock frequency
'will set TWBR and TWSR
'Twbr = 32 'bit rate register
'Twsr = 0 ' pre scaler bits
Waitms 50
I2csend Compass_address , Compass_w_array(1) , 3 ' set Compass Configuration
Waitms 100
Do
Compass_w_array(1) = &H41 ' Command "A": Read heading value
I2csend Compass_address , Compass_w_array(1) , 1 ' send to HMC6352
Waitms 7
I2creceive Compass_address , Compass_r_array(1) , 0 , 2 ' receive the two heading bytes MSB first
Swap Compass_r_array(1) , Compass_r_array(2) ' swap MSB and LSB bytes to be read as WORD variable
Print Compass_value
Waitms 10
Loop
Funktioniert sehr schön.
Außerdem habe ich hier noch Code vom BMP085 Drucksensor, ich frage grad mal den Autor ob sein Code so auch veröffentlicht werden darf.
-
Der Code für den Drucksensor (noch nicht getestet), von http://www.kh-gps.de/
Code:
'BMP085_8_lcd2a_t 86% belegt OK am 25.3.2010
'###############################################################################
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600
$hwstack = 64
$swstack = 64
$framesize = 64
$sim
'###############################################################################
'Byte = 0 to 255
'Word = 0 to 65535
'Integer = -32768 to 32767
'Long = -214783648 to 2147483647
'Single = 1.5 x 10^-45 to 3.4 x 10^38
'Double = 5.0 x 10^-324 to 1.7 x 10^38
Dim Ac1 As Single
Dim Ac2 As Single
Dim Ac3 As Single
Dim Ac4 As Long
Dim Ac5 As Long
Dim Ac6 As Long
Dim B1 As Single
Dim B2 As Single
Dim B3 As Long
Dim B4 As Long
Dim B4a As Single
Dim B5 As Single
Dim B6 As Single
Dim B7 As Long
Dim Mb As Single
Dim Mc As Single
Dim Md As Single
Dim Ut As Long
Dim Up As Long
Dim X1 As Single
Dim X2 As Single
Dim X3 As Single
Dim Zwr1 As Single
Dim Zwr2 As Single
Dim Zwr3 As Single
Dim Zwr4 As Single
Dim T As Single
Dim T_str As String * 4
Dim P As Single
Dim P2 As Single
Dim Po As Single
Dim A As Single
Dim A2 As Word
Dim Adres As Byte
Dim Value As Byte
Dim Result As Integer
Dim Hi As Long
Dim Lo As Long
Dim Xlo As Long
Config Scl = Portb.1
Config Sda = Portb.0
I2cinit
Config Portb.6 = Output
Config Portb.7 = Output
Portb = &B11000000
Dim N As Byte
N = 1
Do
Portb.6 = 1
Portb.7 = 0
Waitms 50
Portb.6 = 0
Portb.7 = 1
Waitms 50
N = N + 1
Loop Until N = 20
Declare Sub Write_bmp(byval Adres As Byte , Byval Value As Byte)
Declare Sub Read_bmp(byval Adres As Byte , Value As Byte)
Declare Sub Read_reg
Const Addressw = &B11101110 'slave write address
Const Addressr = &B11101111 'slave read address
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Cls
Cursor Off
Locate 1 , 1
Lcd " BMP085-DECODER "
Locate 2 , 1
Lcd "(C)2010 KHH V1.2"
Wait 3
'hole Kalibrierungsdaten
'-------------------------------------------------------------------------------
Adres = &HAA 'Startadresse calibration data
'Do
Waitms 50
Call Read_reg
Ac1 = Result
'Print "AC1= " ; Ac1
Call Read_reg
Ac2 = Result
'Print "AC2= " ; Ac2
Call Read_reg
Ac3 = Result
'Print "AC3= " ; Ac3
Call Read_reg
Ac4 = Result
'Print "AC4= " ; Ac4
Call Read_reg
Ac5 = Result
'Print "AC5= " ; Ac5
Call Read_reg
Ac6 = Result
'Print "AC6= " ; Ac6
Call Read_reg
B1 = Result
'Print "B1= " ; B1
Call Read_reg
B2 = Result
'Print "B2= " ; B2
Call Read_reg
Mb = Result
'Print "MB= " ; Mb
Call Read_reg
Mc = Result
'Print "MC= " ; Mc
Call Read_reg
Md = Result
'Print "MD= " ; Md
'Print
Dim Xx As Byte
Xx = 1
Do
Waitms 100
'hole Rohdaten Temperatur
'-------------------------------------------------------------------------------
Call Write_bmp(&Hf4 , &H2E)
Waitms 5
Call Read_bmp(&Hf6 , Value) 'read it back
Hi = Value * 256
Call Read_bmp(&Hf7 , Value) 'read it back
Ut = Hi + Value
'Print "UT= " ; Ut
'Print
Waitms 100
'hole Rohdaten Luftdruck
'-------------------------------------------------------------------------------
Call Write_bmp(&Hf4 , &H34)
Waitms 40
Call Read_bmp(&Hf6 , Value) 'read it back
Hi = Value * 256
Call Read_bmp(&Hf7 , Value) 'read it back
Up = Hi + Value
'Print "UP= " ; Up
'Print
'Testwerte
'------------------------------------------------------
Ac1 = 408
Ac2 = -72
Ac3 = -14383
Ac4 = 32741
Ac5 = 32757
Ac6 = 23153
B1 = 6190
B2 = 4
Mb = -32768
Mc = -8711
Md = 2868
Ut = 27898 'Temperatur
Up = 23843 'Pressure
'kalkuliere tatsaechliche Temperatur
'-------------------------------------------------------------------------------
Zwr1 = Ut - Ac6
Zwr2 = 2 ^ 15
Zwr2 = Ac5 / Zwr2
X1 = Zwr1 * Zwr2
Print "X1= " ; X1
Zwr1 = 2 ^ 11
Zwr2 = Mc * Zwr1
Zwr3 = X1 + Md
X2 = Zwr2 / Zwr3
Print "X2= " ; X2
B5 = X1 + X2
Print "B5= " ; B5
T = B5 + 8
Zwr3 = 2 ^ 4
T = T / Zwr3
T = T / 10
T_str = Str(t)
T_str = Left(t_str , 4)
Print "T= " ; T_str ; " C"
Print
'kalkuliere tatsaechlichen Luftdruck
'-------------------------------------------------------------------------------
B6 = B5 - 4000
Print "B6= " ; B6
Zwr1 = 2 ^ 11
Zwr2 = 2 ^ 12
Zwr3 = B6 / Zwr2
Zwr3 = B6 * Zwr3
Zwr4 = B2 * Zwr3
X1 = Zwr4 / Zwr1
Print "X1= " ; X1
Zwr1 = 2 ^ 11
Zwr2 = B6 / Zwr1
X2 = Ac2 * Zwr2
Print "X2= " ; X2
X3 = X1 + X2
Print "X3= " ; X3
Zwr1 = Ac1 * 4
Zwr1 = Zwr1 + X3
Zwr1 = Zwr1 + 2
If Xx = 1 Then B3 = Zwr1 * 4 '681
If Xx = 2 Then B3 = Zwr1 * 2 '1006
If Xx = 3 Then B3 = Zwr1 '142
If Xx = 4 Then B3 = Zwr1 / 2 '720
If Xx = 5 Then B3 = Zwr1 / 4 '1010(orig)
Print "B3= " ; B3
Zwr1 = 2 ^ 13
Zwr2 = B6 / Zwr1
X1 = Ac3 * Zwr2
'Print X1
'X1 = Abs(x1)
Print "X1= " ; X1
Zwr1 = 2 ^ 12
Zwr2 = 2 ^ 16
Zwr3 = B6 / Zwr1
Zwr3 = B6 * Zwr3
Zwr4 = B1 * Zwr3
X2 = Zwr4 / Zwr2
Print "X2= " ; X2
X3 = X1 + X2
X3 = X3 + 2
X3 = X3 / 4
Print "X3= " ; X3
Zwr1 = X3 + 32768
Zwr2 = 2 ^ 15
Zwr3 = Zwr1 / Zwr2
'Print "Zwr3= " ; Zwr3
'Print "Ac4 = " ; Ac4
B4a = Ac4 * Zwr3
B4 = Abs(b4a)
Print "B4= " ; B4a
B7 = Up - B3
Dim B7a As Long
B7a = B7 * 50000
Print "B7= " ; B7a
Zwr1 = B7a * 2
Zwr1 = Zwr1 / B4
Zwr2 = B7a / B4
Zwr2 = Zwr2 * 2
If B7a < &H8000000 Then P = Zwr1 Else P = Zwr2
Print "P= " ; P
Zwr1 = 2 ^ 8
Zwr2 = P / Zwr1
X1 = Zwr2 * Zwr2
Print "X1= " ; X1
Zwr1 = 2 ^ 16
X1 = X1 * 3028
X1 = X1 / Zwr1
X1 = Abs(x1)
Print "X1= " ; X1
Zwr1 = -7357 * P
Zwr2 = 2 ^ 16
X2 = Zwr1 / Zwr2
Print "X2= " ; X2
Print
Zwr1 = X1 + X2
Zwr1 = Zwr1 + 3791
Zwr2 = 2 ^ 4
Zwr1 = Zwr1 / Zwr2
P = P + Zwr1
Print "P= " ; P ; "Pa"
P = P / 100
Print "XX= " ; Xx
Dim P_str As String * 8
P_str = Fusing(p , "#.##")
Print "P= " ; P_str ; "hPa"
'kalkuliere Hoehenwerte
'-------------------------------------------------------------------------------
Po = 1013.25 'Pressure auf Seepegel
Zwr1 = 1 / 5.255
Zwr2 = P / Po
Zwr3 = Zwr2 ^ Zwr1
Zwr4 = 1 - Zwr3
A = 44330 * Zwr4
A2 = Int(a)
Print "A= " ; A2 ; "m"
Print
'LCD-Ausgabe
'-------------------------------------------------------------------------------
Cls
Locate 1 , 7
Lcd P_str ; "hPa"
Locate 1 , 1
Lcd Up
Locate 2 , 1
Lcd A2 ; "m"
Locate 2 , 11
Lcd T_str ; Chr(223) ; "C"
'Wait 2
Xx = Xx + 1
If Xx = 6 Then Xx = 1
Loop
End
'------------------------------------------------------------
Sub Read_reg
Call Read_bmp(adres , Value)
Hi = Value * 256
Adres = Adres + 1
Call Read_bmp(adres , Value)
Result = Hi + Value
Adres = Adres + 1
End Sub
'----------------------------------------------------------
Sub Write_bmp(byval Adres As Byte , Byval Value As Byte)
I2cstart 'start condition
I2cwbyte Addressw 'slave address
I2cwbyte Adres 'address of register
I2cwbyte Value 'value to write
I2cstop 'stop condition
Waitms 10 'wait for 10 milliseconds
End Sub
'----------------------------------------------------------
Sub Read_bmp(byval Adres As Byte , Value As Byte)
I2cstart 'generate start
I2cwbyte Addressw 'slave address
I2cwbyte Adres 'address of register
I2cstart 'repeated start
I2cwbyte Addressr 'slave address (read)
I2crbyte Value , Nack 'read byte
I2cstop 'generate stop
Waitms 10
End Sub
-
Ich hab ne Frage, ich verfolge dein Projekt schon seit längerem:
GPS:
Das GPS ist doch ziemlich ungenau. Ich meine vorallem wenn man bedenkt das Verhältnis zum Kopter. Wäre es da nicht besser am Boden ein Fleck anzupeilen und den zu halten? Zusätzlich kommen noch störungen bzgl des Satellitenempfangs in Frage weil ja die Motoren bei dir ja doch recht nah bei einander sind.
Und wegen Dem Podest:
Wenn du dein Podest über die Rotoren plazierst, heißt das, dass die Rotoren an sog verlieren, das ansich ist ja noch kein Problem aber wenn nur ein Teil bedeckt ist, wirkt sich das doch sicher negativ auf das Flugverhalten aus. Ich würde daher die zusätzlich Elektronik unterhalb anbringen.
-
Hi oratus sum,
danke für deine Anregungen. Ich glaube aber GPS ist relativ gut geeignet. Wenn mein Copter innerhalb eines Radius' von 5m bleibt bin ich fürs erste schon zufrieden. Die Motoren stören den GPS Empfang meines Wissens nach nicht.
Zu GPS gibt es wohl noch keine realistische Alternative für Hobbybastler. Der Copter soll ja nicht nur die Position halten sondern später auch Pfade abfliegen. Schön wäre natürlich eine hochauflösende 3D Kartierung der Umgebung, aber soweit ist die frei verfügbare und erschwingliche Technik noch nicht.
Zitat:
Und wegen Dem Podest:
Das kommt ja nicht über die Rotoren, sondern über das Chassis. Also in der Mitte, da wo keine Propeller sind und ganz wenig verwirbelte Luft. Wenn ich die Elektronik unter das Chassis machen bekomme ich Probleme mit dem GPS Empfang und dem Luftdrucksensor.
-
so.. platine habe ich bald fertig... noch ein paar fragen:
das summensignal kommt ja vom empfänger über einen servostecker, allerdings hat der empfänger ja schon strom vom mainboard... soll ich dann den empfängeranschöluss mit einem jumper stromversorgbar machen?
sollen wir vielcht noch eine sd-karte draufmachen?? für waypoints/flug speichern und am rechner visualisieren oder sonstige spässe ??
und auf dem bild von der platine oben.. was ist denn das unter dem gps??
-
Eine alternite gibt es Bald mit dem europäischen Satellitenprogramm, doch ja....
Was für ein GPS verwendest du? Ich hab ein Fastrax I-300, allerdings kann ich in Gebäuden nichts empfangen, ist aber nicht überraschend.
Dann noch eine Frage:
Wie regelst du die Motoren? Bzw würde mich überhaupt alles rund um die Motoren interessieren.
Ich spiele nämlich mit dem Gedanken auch etwas Flugfähiges aufzubauen wenn ich halbwegs mit MARS fertig bin.