Miesięczne archiwum: Październik 2009

Jak mierzyc temperaturę z Arduino

Jednym z czujników wchodzących w skład Arduino Starter Kit’u jest czujnik temperatury. Jest to czujnik analogowy, nie potrzebujący żadnych dodatkowych elementów do działania (dokładnie jest to MCP9700-E/TO). Czyli, krótko mówiąc podpinamy masę, zasilanie i już możemy mierzyć temperaturę. Na stronie czujnika w sklepie Nettigo, w zakładce Pliki jest PDF z danymi katalogowymi. I tak, zacznijmy od nóżek:

MCP9700 - oznaczenia pinów

MCP9700 – oznaczenia pinów

. Ważne – nóżki są opisane tak jak widać je patrząc od spodu czujnika. I tak:  do 1 podłączamy napięcie zasilania (zarówno 3.3V lub 5V z Arduino będzie OK), do 3 podłączamy masę (GND) a 2 do pinu Analog 0 na Arduino. W tabelce w dokumentacji czujnika na stronie drugiej mamy pozycję Output Voltage, przy temperaturze 0°C – 500 mV.  Z pierwszej strony PDFa wiemy że czułość wynosi 10 mV/ºC. I to wszystko co nam potrzeba aby napisać prosty program:

float temp;

void setup() {
  Serial.begin(57600);
};

void loop () {
  temp = analogRead(0)*5/1024.0;
  temp = temp - 0.5;
  temp = temp / 0.01;
  Serial.println(temp);
  delay(500);
};

Program odczytuję temperaturę i wysyła odczyt na Serial, z którego możemy go odczytać korzystając z monitora port szeregowego w Arduino IDE. Jak liczona jest temperatura? Rozbiłem ten proces na trzy kroki tak, aby łatwiej było go prześledzić:

  1. temp = analogRead(0)*5/1024.0; Odczytujemy wartość z wejścia analogowego i przeliczamy na napięcie. Maksymalne napięcie mierzone przez Arduino to 5V a dokładność przetwornika A/D to 10 bitów, czyli 1024 wartości. Dlatego wartość napięcia na wejściu Analog0 to wartość zwrócona przez analogRead pomnożona przez napięcie przypadające na jeden krok przetwornika A/D. Trzeba pamiętać, że dzielenie dwóch liczb 5 i 1024 będzie przez kompilator potraktowane jako operacja na  liczbach całkowitych i wynik takiego dzielenia to w takim wypadku to też liczba całkowita – zero. Dlatego w zapisie pojawia się 1024.0 Dzięki temu kompilator dokona dzielenia o jakie nam chodzi i wynik będzie liczbą niecałkowitą.
  2. temp = temp - 0.5; Skalujemy do 0°C – różnica między napięciem odczytanym z czujnika  a 500 mV jest liniowo zależna od temperatury.
  3. temp = temp / 0.01; Tą różnicę dzielimy przez 10mV na stopień i mamy temperaturę

Jak widać czujnik MCP9700 jest bardzo łatwy w zastosowaniu i przyjazny dla początkujących. Teraz już każdy może zmierzyć temperaturę z Arduino.

Arduino SMS i nie tylko

Moduł GSM do Arduino pozwala na przekształcenie Arduino w telefon komórkowy :) No – mniej więcej.

Arduino z modułem GSM (prowizoryczny zasilacz w tle)

Arduino z modułem GSM (prowizoryczny zasilacz w tle)

Ale od początku. Najpierw potrzebujemy moduł GSM do Arduino oraz aktywną kartę SIM. Kartę wsadzamy do modułu i możemy przystąpić do testów. Pierwsza sprawa zasilanie. Moduł GSM jest dość wymagający jeśli chodzi o zasilanie. Nie każdy port USB będzie w stanie zasilić Arduino z modułem GSM. Objaw będzie taki, że po wklepaniu PINu komunikacja znika, to trzeba zorganizować dodatkowe zasilanie. Jak – o tym później.

Testujemy moduł

Moduł może pracować w dwóch trybach komunikacji szeregowej. Albo „rozmawia” z Arduino albo z komputerem dopiętym do port USB Arduino. Ten pierwszy tryb to jest normalny tryb produkcyjny drugi może zostać wykorzystany do testów. Aby skorzystać z tego drugiego trybu:

  1. wyjmujemy ATMega z Arduino (Arduino będzie służyło tylko jako zasilanie oraz skorzystamy z konwertera USB/Serial)
  2. ustawiamy na module zworki trybu pracy na USB gateway
  3. wsadzamy kartę SIM
  4. podpinamy Arduino do komputera
  5. przytrzymujemy przycisk ON/OFF na module przez dwie sekundy
  6. uruchamiamy program terminala (gtkterm) wybieramy port szeregowy i ustawiamy 115200 8,N,1 tryb końca linii CR (nie CR+LF) i używając DUŻYCH liter piszemy komendy AT
    • AT – oczekiwana odpowiedź OK – to jest znak że jest komunikacja z modemem
    • AT+CPIN=”ABCD”  – gdzie ABCD jest PINem wsadzonej karty SIM – powinniśmy dostać odpowiedź OK jeżeli PIN jest dobry, +CME ERROR 16 jeśli zły
    • moduł zaczyna szukać sieci GSM – jeżeli w ciągu kilku następnych sekund nadal będzie odpowiadać OK na komendę AT, znaczy że port USB dał radę zasilić układ. Jeżeli komunikacja zamrze – trzeba szykować dodatkowe zasilanie
    • jeżeli wszystko działa możemy popróbować kilku komend:
      • AT+COPS? – zwraca nazwę operatora sieci komórkowej
      • AT+CPBR=# zwraca wpis z książki adresowej na karcie gdzie # to numer z książki adresowej
      • AT*PSCPOF – wyłącz moduł
      • ATD##########; – zadzown pod numer kryjacy sie za ciągiem # (oczywiście na razie rozmawiać się nie da)
      • ATH – rozłącz rozmowę
    • wysyłanie SMS – wykonaj następujące kroki:
      • AT+CSCA? – ściągnij numer centrum SMS
      • AT+CMGF=1 – tryb wysyłania SMSów – 1 to tekstowy
      • AT+CMGS=”#######” – numer na jaki chcemy wysłać SMS
      • po AT+CMGS zaczynamy wpisywac tresc wiadomosci w jednej lini i konczymy znakiem o kodzie 1A szesnastkowo
      • czekamy na SMS’a ;)

Pełna lista komend AT dla modemu Sagem HiLO.

Moduł GSM ma wyjście do mikrofonu i głośnika, więc po podłączeniu tychże Arduino może działać jako telefon komórkowy :)

Zasilanie

Na module jest zworka określająca źródło zasilania. Ustawiona w pozycji oznaczonej 5V wybiera Arduino (a więc port USB) jako źródło zasilania dla modułu GSM. Wybrani ext pozwoli nam zasilić sam moduł z oddzielnego zasialacza. Producent sugeruje, że całość (Arduino + moduł GSM) powinny być zasilane 12 V, 2A. Dla zasilaczy o wydajności mniejszej niż 2A należy dodać kondensator 220 μF. W moich testach udało mi się bez problemu uruchomić całość zasilając Arduino przez USB a moduł GSM z zasilacza 12V/0.5 A z kondensatorem 200 μF oraz konwerterem napięcia na 5V (L7805).

1 - złącze zasilania i zworka wyboru źródła, 2 - wybór trybu komunikacji

1 - złącze zasilania i zworka wyboru źródła, 2 - wybór trybu komunikacji

Sterowanie z Arduino

Moduł GSM gdy zworka komunikacji szeregowej jest ustawiona na Arduino podłącza się do portu szeregowego Arduino i wysyłając z Arduino komendy na port szeregowy (przez Serial.println) sterujemy modułem GSM. Przykładowy kod:

int led = 13;
int onModulePin = 2;        // the pin to switch on the module (without press on button) 
int timesToSend = 1;        // Numbers of SMS to send
int count = 0;

void switchModule(){

  digitalWrite(onModulePin,HIGH);
  delay(2000);
  digitalWrite(onModulePin,LOW);

}

void setup(){

  pinMode(led, OUTPUT);
  pinMode(onModulePin, OUTPUT);
  Serial.begin(115200);               // the GPRS baud rate
  switchModule();                    // swith the module ON

  for (int i=0;i<5;i++){
    delay(5000);
  } 
   Serial.println("AT+CMGF=1");         // set the SMS mode to text
}

void loop(){

  while (count < timesToSend){
    delay(1500);

    Serial.print("AT+CMGS=");               // send the SMS the number
    Serial.print(34,BYTE);                  // send the " char
    Serial.print("*********");              // send the number change ********* by the actual number
    Serial.println(34,BYTE);                // send the " char
    delay(1500);
    Serial.print("Arduino SMS...");     // the SMS body
    delay(500);
    Serial.println(0x1A,BYTE);                // end of message command 1A (hex)
    delay(5000);        
    count++;
  }

  if (count == timesToSend){
    Serial.println("AT*PSCPOF");             // switch the module off
    count++;
  }

}

Na koniec – moduł GSM ma dość nietypowy kształt, prawda? Otóż doskonale on współgra z innym shieldem – GPSowym :)

Arduino z shieldem GSM i GPS

Arduino z shieldem GSM i GPS

Ale o tym już następnym razem.