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






