Moin,
endlich sind sie fertig, meine kleinen I²C-Sonarplatinen
Einige von euch hatten ja schon per PN Interesse bekundet, die kriegen gleich Post. Trotzdem wollte ich diesen Beitrag als kleine Anleitung schreiben.
Für alle die noch nicht wissen worum es geht:
Mir gefiel der Gedanke nicht, einen Sonarsensor wie den HC-SR04 direkt an meine FC anzuschließen, also habe ich eine kleine Platine designed, die mit einem Tiny44 bestückt den Sensor ausliest und die Werte über I²C an die FC schickt.
Technische Daten:
- Maße 45x21mm (genau wie HC-SR04)
- 2mm Bohrlöcher wie HC-SR04 zur Huckepackmontage und/oder 3mm Bohrlöcher 35mm Abstand
- mit Lötpads zur Adressauswahl, kann 8 verschiedene Adressen annehmen (somit sind mehrere Sonarsensoren parallel möglich)
- Versorgungsspannung 5V
- eigener 3,3V 100mA Spannungswandler, kann für externe Zwecke genutzt werden (Spektrum, …)
- I²C Ports 5V (Arduino) und 3,3V kompatibel (Naze32)
- I²C mit 100kHz oder 400kHz (mehr ist nicht getestet, halt ich aber nicht für ratsam)
- Sonarauflösung 16-bit, Wert wird als Reinwert übergeben, ungefiltert. Division durch 58 ergibt Abstand in cm
- wahlweise ADC nutzbar. 10-bit Auflösung 0-5V zum Anschluss analoger Sensoren, Sharp IR-Sensoren, aber auch Spannungs- oder Strommessung möglich
- mit zwei LEDs, eine zeigt Versorgungsspannung an, die andere Betriebsmodi (2x Blinken = ADC, 3x Blinken = Sonar)
- Abtastung erfolgt mit 50ms
NOCH gibt es keine fertige Integration für das Sonar in die Naze32. Alexmos hat im Multiwii Forum mit dem HC-SR04 eine sehr erfolgreiche Implementierung des Sonars vorgenommen, mein Bestreben ist es, diese bald auf das Naze32 zu kopieren. Jeder der Interesse an der Platine hat, sollte sich aber im Klaren darüber sein, dass er selber Hand anlegen muss, oder auf diese Implementierung warten.
Diese Platine ist ebenfalls kein Serienprodukt und ist mit äußerster Sorgfalt zu verwenden. Wenn z.B. die I²C Steckverbindung unglücklich getrennt wird (im Flug), oder die Stromversorgung des Boards ausfällt, kann das zu Problemen auf dem I²C-Bus führen. Da hier alle lebenswichtigen Sensoren für den Copter dranhängen, ist dies gefährlich! Nicht das es nachher heißt mein Copter ist abgestürzt und deine doofe Platine ist Schuld, Verwendung auf eigene Gefahr!
Die Standardadresse der Sensoren ist hex40 (8-bit Schreibweise, im Naze32 Sourceode wäre das hex20, weil dort 7-bit Schreibweise verwendet wird) und kann über Lötbrücken bis auf hex4E erhöht werden, somit sind 8 verschiedene Adressen möglich.
Um das Sonar zu aktivieren muss einmal der Befehl hex32 gesendet werden, zur Aktivierung des ADC hex33. Man kann auch beide im Wechsel auslesen, es ist also möglich an eine Platine sowohl Sonar als auch einen analogen Sensor anzuschließen, falls gewünscht.
Als Beispielprogramm zum Sonarauslesen folgende Zeilen, geschrieben für das Naze32:
Last but not least: Ich habe ein paar mehr Platinen fertigen lassen, als ich selber brauche, darum gebe ich gerne welche ab, solange der Vorrat reicht. Fertig aufgebaut mit allen Bauteilen und geflashtem Prozessor hät ich gerne 10€ inkl. Versand dafür. Versand von den Kanaren, kann also 'ne Woche dauern per Luftpost...
endlich sind sie fertig, meine kleinen I²C-Sonarplatinen
Einige von euch hatten ja schon per PN Interesse bekundet, die kriegen gleich Post. Trotzdem wollte ich diesen Beitrag als kleine Anleitung schreiben.
Für alle die noch nicht wissen worum es geht:
Mir gefiel der Gedanke nicht, einen Sonarsensor wie den HC-SR04 direkt an meine FC anzuschließen, also habe ich eine kleine Platine designed, die mit einem Tiny44 bestückt den Sensor ausliest und die Werte über I²C an die FC schickt.
Technische Daten:
- Maße 45x21mm (genau wie HC-SR04)
- 2mm Bohrlöcher wie HC-SR04 zur Huckepackmontage und/oder 3mm Bohrlöcher 35mm Abstand
- mit Lötpads zur Adressauswahl, kann 8 verschiedene Adressen annehmen (somit sind mehrere Sonarsensoren parallel möglich)
- Versorgungsspannung 5V
- eigener 3,3V 100mA Spannungswandler, kann für externe Zwecke genutzt werden (Spektrum, …)
- I²C Ports 5V (Arduino) und 3,3V kompatibel (Naze32)
- I²C mit 100kHz oder 400kHz (mehr ist nicht getestet, halt ich aber nicht für ratsam)
- Sonarauflösung 16-bit, Wert wird als Reinwert übergeben, ungefiltert. Division durch 58 ergibt Abstand in cm
- wahlweise ADC nutzbar. 10-bit Auflösung 0-5V zum Anschluss analoger Sensoren, Sharp IR-Sensoren, aber auch Spannungs- oder Strommessung möglich
- mit zwei LEDs, eine zeigt Versorgungsspannung an, die andere Betriebsmodi (2x Blinken = ADC, 3x Blinken = Sonar)
- Abtastung erfolgt mit 50ms
NOCH gibt es keine fertige Integration für das Sonar in die Naze32. Alexmos hat im Multiwii Forum mit dem HC-SR04 eine sehr erfolgreiche Implementierung des Sonars vorgenommen, mein Bestreben ist es, diese bald auf das Naze32 zu kopieren. Jeder der Interesse an der Platine hat, sollte sich aber im Klaren darüber sein, dass er selber Hand anlegen muss, oder auf diese Implementierung warten.
Diese Platine ist ebenfalls kein Serienprodukt und ist mit äußerster Sorgfalt zu verwenden. Wenn z.B. die I²C Steckverbindung unglücklich getrennt wird (im Flug), oder die Stromversorgung des Boards ausfällt, kann das zu Problemen auf dem I²C-Bus führen. Da hier alle lebenswichtigen Sensoren für den Copter dranhängen, ist dies gefährlich! Nicht das es nachher heißt mein Copter ist abgestürzt und deine doofe Platine ist Schuld, Verwendung auf eigene Gefahr!
Die Standardadresse der Sensoren ist hex40 (8-bit Schreibweise, im Naze32 Sourceode wäre das hex20, weil dort 7-bit Schreibweise verwendet wird) und kann über Lötbrücken bis auf hex4E erhöht werden, somit sind 8 verschiedene Adressen möglich.
Um das Sonar zu aktivieren muss einmal der Befehl hex32 gesendet werden, zur Aktivierung des ADC hex33. Man kann auch beide im Wechsel auslesen, es ist also möglich an eine Platine sowohl Sonar als auch einen analogen Sensor anzuschließen, falls gewünscht.
Als Beispielprogramm zum Sonarauslesen folgende Zeilen, geschrieben für das Naze32:
Code:
#define SONAR_ADDRESS 0x20 //7-bit!!!
// Registers
#define SONAR_DISTANCE_OUT 0x32
#define SONAR_ADC_OUT 0x33
void i2c_sonar_get_distance(int16_t *sonarAlt)
{
uint8_t buf[2];
int16_t temp;
i2cRead(SONAR_ADDRESS, SONAR_DISTANCE_OUT, 2, buf);
temp = (int16_t)((buf[1] << 8) | buf[0]);
*sonarAlt = temp / 58;
}
Anhänge
-
178 KB Aufrufe: 68