Lekcja 17: Żyroskop
Tematem tej lekcji jest czujnik L3GD20H 3-osiowy, cyfrowy żyroskop I2C SPI. W lekcji wykorzystujemy oprócz standardowych bibliotek arduino
kod napisany w Pythonie, który korzysta z biblioteki podsłuchującej port szeregowy.
Moduł wyposażony w żyroskop L3GD20H, który służy do pomiaru prędkości kątowej w trzech osiach X, Y, Z.
Posiada możliwość wyboru zakresu pomiarowego z dostępnych: ±245 °/s, ±500 °/s lub ±2000 °/s.
Specyfikacja czujnika poniżej:
|
|
Wyprowadzenia:

| PIN | Opis |
|---|---|
| VIN | Napięcie zasilania: 2,5 V - 5,5 V. Konwerter napięć ustala stan wysoki wyprowadzeń SCL i SDA na tę wartość. |
| GND | Potencjał masy układu. |
| VDD | Wyjście regulatora 3,3 V o wydajności maksymalnej 150 mA. |
| SCL/SPC | Linia zegarowa I2C/SPI, podłączona poprzez konwerter napięć. Stan wysoki równy jest napięciu VIN, niski 0 V. |
| SDA/SDI | Linia danych I2C / wejściowa SPI, podłączona poprzez konwerter napięć. Stan wysoki równy jest napięciu VIN, niski 0 V. |
| SDO | Linia danych wejściowych SPI, używany również do zmiany adresu magistrali I2C. Ten pin nie posiada regulatora napięcia, toleruje tylko napięcie 3,3 V. |
| CS | Pin umożliwiający włączenie magistrali SPI poprzez podanie stanu niskiego. Domyślnie podciągnięty do 3,3 V - włączony interfejs I2C. Ten pin nie posiada regulatora napięcia, toleruje tylko napięcie 3,3 V. |
| DRDY/INT2 | Gotowość danych do odczytu / przerwanie od kolejki FIFO. Ten pin nie posiada regulatora napięcia, toleruje tylko napięcie 3,3 V. |
| INT1 | Konfigurowalne przerwanie. Ten pin nie posiada regulatora napięcia, toleruje tylko napięcie 3,3 V. |
| DEN | Wyzwolenie danych pomiarowych. Ten pin nie posiada regulatora napięcia, toleruje tylko napięcie 3,3 V. |
Łączymy układ z Arduino za pomocą złączy VIN, GND, SCL i SDA.
Piszemy kod w arduino IDE:
#include < Wire.h>
#include < L3G.h>
L3G gyro;
int prev_rate[3];
int angle[3];
unsigned long time;
int sampleTime=10;
int rate[3];
int sampleNum=250;
int dc_offset=0;
void setup(){
Serial.begin(9600);
Wire.begin();
if (!gyro.init())
{
Serial.println("Failed to autodetect gyro type!");
while (1);
}
gyro.enableDefault();
}
void loop()
{
gyro.read();
for(int i=0;i<=2;i++){
if(i==0){
rate[i]=((int)gyro.g.x-dc_offset)/1000;
}
if(i==1){
rate[i]=((int)gyro.g.y-dc_offset)/1000;
}
if(i==2){
rate[i]=((int)gyro.g.z-dc_offset)/1000;
}
angle[i] += ((double)(prev_rate[i] + rate[i]) * sampleTime)/125;
prev_rate[i] = rate[i];
}
Serial.println(String(angle[0])+";"+String(angle[1])+";"+String(angle[2]));
delay(1);
}
Do uruchomienia kodu w Pythonie należy zainstalować Pythona 2.7 wraz z bibliotekami python_visual, pyserial.
Kod w Pythonie:
from visual import *
from visual.graph import *
import serial
x = 0
odlX=0
odlY=0
odlZ=0
grad2rad = 3.141592/180.0
arduinoSerialData = serial.Serial('/dev/ttyACM0', 9600)
f1 = gcurve(color=color.cyan)
f2 = gcurve(color=color.white)
f3 = gcurve(color=color.red)
scene2 = display(width=600, height=600, center=(0, 0, 0))
deska = box(length=1, height=0.05, width=1, color=color.green)
p_line = box(length=1,height=0.08,width=0.1,color=color.yellow)
deska_strzalka = arrow(color=color.red, axis=(1, 0, 0), shaftwidth=0.06, fixedwidth=1)
while (1 == 1):
if (arduinoSerialData.inWaiting() > 0):
dane = arduinoSerialData.readline()
odl = dane.split(';')
dl = len(odl)
print dl
if (dl == 3):
print odl
if (odl[0] != ''):
odlX = int(odl[0])*grad2rad
f1.plot(pos=(x, odlX))
if (odl[1] != ''):
odlY = int(odl[1])*grad2rad
f2.plot(pos=(x, odlY))
if (odl[2] != ''):
odlZ = int(odl[2])*grad2rad
f3.plot(pos=(x, odlZ))
x += 1
axis = (cos(odlY) * cos(odlZ), -cos(odlY) * sin(odlZ), sin(odlY))
up = (sin(odlX) * sin(odlZ) + cos(odlX) * sin(odlY) * cos(odlZ), sin(odlX) * cos(odlZ) - cos(odlX) * sin(odlY) * sin(odlZ), -cos(odlX) * cos(odlY))
deska.axis = axis
deska.up = up
deska.length = 1.0
deska.width = 0.65
deska_strzalka.axis = axis
deska_strzalka.up = up
deska_strzalka.length = 0.8
p_line.axis = axis
p_line.up = up
Powrót do spisu materiałów






