User Tools

Site Tools


sparrow_v4

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
sparrow_v4 [2015/09/28 17:11]
dan.tudose [Hello LED cu Arduino IDE si Sparrow V4]
sparrow_v4 [2018/10/12 10:02] (current)
dan.tudose [Senzorul digital de măsurare a luminozității]
Line 37: Line 37:
  
 <imgcaption uc_ports | Porturile digitale de intrare/ieșire pentru ATMega128RFA1> {{ :atmega128rfa1.png|}}</imgcaption> <imgcaption uc_ports | Porturile digitale de intrare/ieșire pentru ATMega128RFA1> {{ :atmega128rfa1.png|}}</imgcaption>
 +
 +----------------------------------------------------------
 +
  
 ===== Mediul de dezvoltare ===== ===== Mediul de dezvoltare =====
Line 62: Line 65:
 ==== Configurarea IDE-ului Arduino pentru Sparrow ==== ==== Configurarea IDE-ului Arduino pentru Sparrow ====
  
 +Step 1. Open the Arduino IDE
 +Step 2. Go to File → Preferences
 +Step 3. In the Additional Boards Manager URLs textbox add the following link: 
 +[[http://clkdiv8.com/download/package_clkdiv8pre_index.json]]
  
-  - Download [[https://www.arduino.cc/en/Main/Software|Arduino]] +Step 4Close the window by pressing OK 
-  - Download and unzip the {{:sparrow_patch.zip|patch}} in a separate folder +Step 5Go to Tools → Board → Boards Manager 
-  - Locate the installation folder of Arduino on your drive (for Windows it's usually Program Files) +Step 6Search “sparrow 
-  - Copy in **Arduino\hardware\arduino\cores** the contents of the folder **sparrow_patch\Arduino\hardware\arduino\cores\sparrow** +Step 7Hit Install 
-  - Replace the file **Arduino\hardware\arduino\boards.txt** with **sparrow_patch\Arduino\hardware\arduino\boards.txt** +Step 8You're done!
-  - Copy in **Arduino\hardware\arduino\variants** the folder named **sparrow** from **sparrow_patch\Arduino\hardware\arduino\variants** +
-  - Restart the Arduino IDE+
  
-After a successful patch, you should be able to select a new board named Sparrow from the Tools>Board menu. Also select the appropriate COM port from the Tools>Port menu+After a successful install, you should be able to select a new board named Sparrow from the Tools>Board menu. Also select the appropriate COM port from the Tools>Port menu
 {{ :arduino.png?500 |}} {{ :arduino.png?500 |}}
 You're all set up! You're all set up!
Line 126: Line 131:
 ===== Hello LED cu Arduino IDE si Sparrow V4 ===== ===== Hello LED cu Arduino IDE si Sparrow V4 =====
  
-Vom testa un program care stinge și aprinde un LED la interval de 1000ms. Acest lucru se face modificând voltajul unuia din pinii microcontroller-ului, în cazul nostru pinul 5 din portul B.+Vom testa un program care stinge și aprinde un LED la interval de 1000ms. Acest lucru se face modificând starea logică a unuia din pinii microcontroller-ului, în cazul nostru pinul 5 din portul B.
  
  
Line 170: Line 175:
 void loop()                     // run over and over again void loop()                     // run over and over again
 { {
-  digitalWrite(ledPin, HIGH);   // sets the LED on+  digitalWrite(ledPin, HIGH);   // sets the LED off (reverse logic)
   delay(1000);                  // waits for a second   delay(1000);                  // waits for a second
-  digitalWrite(ledPin, LOW);    // sets the LED off+  digitalWrite(ledPin, LOW);    // sets the LED on
   delay(1000);                  // waits for a second   delay(1000);                  // waits for a second
 } }
Line 180: Line 185:
  
   - Se creează un proiect nou şi se copiază codul de mai jos (File->New);   - Se creează un proiect nou şi se copiază codul de mai jos (File->New);
-  - În //Tools->Programmer// se alege //USBasp//; 
   - În //Tools->Board// selectaţi //Sparrow//;   - În //Tools->Board// selectaţi //Sparrow//;
   - Se alege portul COM la care a fost conectat nodul din //Tools->Serial Port//;   - Se alege portul COM la care a fost conectat nodul din //Tools->Serial Port//;
Line 192: Line 196:
 <note>**Task 1** <note>**Task 1**
  
- Implementați folosind cele 3 LED-uri de pe placa de extensie o secvență de aprindere dinamică: + Scrieți un program care să cicleze prin toate culorile posibile pentru led-ul RGB.
-//*--   +
--*-  +
---*//+
  
-Led-urile sunt legate la portul B, pinii PB5PB6 și PB7 (pinii 11, 10, respectiv pentru Arduino).</note>+Led-urile sunt legate la portul B, pinii PB4PB5 și PB6 (pinii 8, 11, respectiv 10 pentru Arduino). Comanda led-urilor este pe logică inversă (vezi schema de mai jos). Astfel, un led se va aprinde la setarea pin-ului de output pe LOW și se va stinge la o setare a pin-ului pe HIGH.</note>
  
 <imgcaption leds | LED-urile de pe Sparrow V4>{{ :leds.png?300|}}</imgcaption> <imgcaption leds | LED-urile de pe Sparrow V4>{{ :leds.png?300|}}</imgcaption>
Line 205: Line 206:
 | G | PB5 | 11 | | G | PB5 | 11 |
 | B | PB6 | 10 | | B | PB6 | 10 |
-| IR | PB7 | 9 | 
 </tabcaption>\\ </tabcaption>\\
 \\ \\
Line 228: Line 228:
 void setup() { void setup() {
   // set the digital pin as output:   // set the digital pin as output:
-  DDRB |= (1<<PB5);      +  pinMode(11, OUTPUT);     
 } }
  
Line 249: Line 249:
     {     {
         ledState = HIGH;         ledState = HIGH;
-        PORTB |= 1<<PB5;+        digitalWrite(11, HIGH);
     }     }
     else     else
     {     {
       ledState = LOW;       ledState = LOW;
-      PORTB &= ~(1<<PB5);+      digitalWrite(11, LOW);
     }     }
      
Line 355: Line 355:
 <code C> <code C>
 #include <Wire.h> #include <Wire.h>
-#include <SHT2x.h>+#include <Sodaq_SHT2x.h>
  
-int controlPin 7;+int controlPin=7;
  
 void setup() void setup()
Line 395: Line 395:
 #include "Adafruit_SI1145.h" #include "Adafruit_SI1145.h"
  
-int controlPin 7;+int controlPin 7;
 Adafruit_SI1145 uv = Adafruit_SI1145(); Adafruit_SI1145 uv = Adafruit_SI1145();
  
 void setup() { void setup() {
   pinMode(controlPin, OUTPUT);  //sensor on/off control   pinMode(controlPin, OUTPUT);  //sensor on/off control
-  delay(100);+  digitalWrite(controlPin, LOW); 
 +  delay(1000);
      
   Serial.begin(9600);   Serial.begin(9600);
Line 432: Line 433:
 } }
 </code> </code>
 +===== Senzorul barometric =====
 +
 +<imgcaption barometer |  MS5637 barometer/altimeter>{{ ::ms5637-30ba_600.jpg |}}</imgcaption>
 +
 +Nodurile Sparrow folosesc senzorul [[http://www.meas-spec.com/product/pressure/MS5637-02BA03.aspx|MS5637]] pentru măsurarea presiunii atmosferice și altimetrie. Vom folosi biblioteca [[https://github.com/freetronics/BaroSensor|Freetronics]] pentru a interfața cu el.
 +
 +<code C>
 +#include <Wire.h>
 +#include <BaroSensor.h>
 +int controlPin = 7;
 +
 +void setup()
 +{
 +  pinMode(controlPin, OUTPUT);  //sensor on/off control
 +  delay(100);
 +  
 +  digitalWrite(controlPin, LOW);
 +  
 +  Serial.begin(9600);
 +  BaroSensor.begin();
 +}
 +
 +void loop()
 +{
 +  if(!BaroSensor.isOK()) {
 +    Serial.print("Sensor not Found/OK. Error: "); 
 +    Serial.println(BaroSensor.getError());
 +    BaroSensor.begin(); // Try to reinitialise the sensor if we can
 +  }
 +  else {
 +    Serial.print("Temperature: "); 
 +    Serial.println(BaroSensor.getTemperature());
 +    Serial.print("Pressure:    ");
 +    Serial.println(BaroSensor.getPressure());
 +  }
 +  delay(1000);
 +}
 +</code>
 +
 ==== Senzorul inerțial ==== ==== Senzorul inerțial ====
  
Line 605: Line 645:
 <imgcaption processing | Graficul afișat de la senzor în fereastra Processing>{{ :processing.png |}}</imgcaption> <imgcaption processing | Graficul afișat de la senzor în fereastra Processing>{{ :processing.png |}}</imgcaption>
  
-===== Transmisia radio ===== 
- 
-Pentru a folosi transceiver-ul radio cu care sunt dotate nodurile senzoriale, vom utiliza o bibliotecă scrisă pentru Arduino ce ne va simplifica foarte mult codul. Această bibliotecă se numește ZigduinoRadio și poate fi descărcată de {{::zigduinoradio_201111130010.zip|aici}}.  
- 
-Instalarea bibliotecii este foarte facilă, trebuie doar să dezarhivați arhiva în //Arduino\libraries// 
- 
-Mai jos aveți un exemplu care vă permite să trimiteți și să recepționați date de pe interfața radio. 
- 
-<code C> 
-/* 
- 
-Run this sketch on two Zigduinos, open the serial monitor at 9600 baud, and type in stuff 
-Watch the Rx Zigduino output what you've input into the serial port of the Tx Zigduino 
- 
-*/ 
- 
-#include <ZigduinoRadio.h> 
- 
-void setup() 
-{ 
-  ZigduinoRadio.begin(11); 
-  Serial.begin(9600); 
-   
-  ZigduinoRadio.attachError(errHandle); 
-  ZigduinoRadio.attachTxDone(onXmitDone); 
-} 
- 
-void loop() 
-{ 
-  if (Serial.available()) 
-  { 
-    ZigduinoRadio.beginTransmission(); 
-     
-    Serial.println(); 
-    Serial.print("Tx: "); 
-     
-    while(Serial.available()) 
-    { 
-      char c = Serial.read(); 
-      Serial.write(c); 
-      ZigduinoRadio.write(c); 
-    } 
-     
-    Serial.println();  
-     
-    ZigduinoRadio.endTransmission(); 
-  } 
-   
-  if (ZigduinoRadio.available()) 
-  { 
-    Serial.println(); 
-    Serial.print("Rx: "); 
-     
-    while(ZigduinoRadio.available()) 
-      Serial.write(ZigduinoRadio.read()); 
-       
-    Serial.println(); 
-    Serial.print("LQI: "); 
-    Serial.print(ZigduinoRadio.getLqi(), 10); 
-    Serial.print(", RSSI: "); 
-    Serial.print(ZigduinoRadio.getLastRssi(), 10); 
-    Serial.print(" dBm, ED: "); 
-    Serial.print(ZigduinoRadio.getLastEd(), 10); 
-    Serial.println("dBm"); 
-  } 
-  
-   
-  delay(1000); 
-} 
- 
-void errHandle(radio_error_t err) 
-{ 
-  Serial.println(); 
-  Serial.print("Error: "); 
-  Serial.print((uint8_t)err, 10); 
-  Serial.println(); 
-} 
- 
-void onXmitDone(radio_tx_done_t x) 
-{ 
-  Serial.println(); 
-  Serial.print("TxDone: "); 
-  Serial.print((uint8_t)x, 10); 
-  Serial.println(); 
-} 
-</code> 
- 
-<note>**Task 0:** Rulați exemplul de mai sus și adăugați un identificator unic fiecărui nod (de ex. numele vostru).</note> 
- 
-<note>**Task 1:** Proiectați un protocol de transmisie simplu pentru pachete în rețea. Fiecare pachet va fi de lungime fixă (39 octeți), primul octet va fi adresa nodului care face transmisia, următorii doi octeți vor codifica un sequence number pentru transmisie, urmează 32 de biți pentru payload și 4 biți la final pentru CRC. Pentru CRC-32 puteți să folosiți implementarea de [[http://excamera.com/sphinx/article-crc.html|aici]] 
-</note> 
-{{ ::payload.png |}} 
-<note>**Task 2:** Folosind protocolul de mai sus și codul din laboratorul trecut, trimiteți datele de la senzori periodic prin radio. Dacă reușiti, veți putea vedea toate datele de la toti ceilalti senzori (inclusiv ale senzorilor vostri). Datele de la senzori vor fi codificate în payload-ul pachetelor de rețea în perechi de tipul: <sensor_id><sensor_value>, unde sensor_id are 1 octet iar sensor_value are 2 octeți lungime. Sensor_id poate avea următoarele valori: 0-temperatură, 1-umiditate, 2-luminozitate, 3-tensiune baterie. </note> 
-<note>**Task 3:** Scrieți un sketch Processing care să vă afișeze grafic toate datele de la toți senzorii conectați </note> 
- 
-===== Protocoale de transmisie radio ===== 
- 
-Pentru lucrarea curentă de laborator veți folosi biblioteca ZigduinoTransfer ce folosește clasele definite în laboratorul anterior pentru transmisia radio. Clasa implementează un protocol peste functiile de transmisie și recepție obișnuite și poate fi descărcată de {{:zigduinoprotocol.zip| aici}}. 
- 
-Instalarea bibliotecii este foarte facilă, trebuie doar să dezarhivați arhiva în Arduino\libraries 
- 
-Mai jos aveți un exemplu care vă permite să trimiteți și să recepționați pachete de date de pe interfața radio. Pentru aceasta aveți nevoie de două noduri: primul rulează codul care transmite (Tx) și al doilea recepționează (Rx). 
- 
-Codul pentru Transmitter: 
-<code C> 
-#include <ZigduinoTransfer.h> 
- 
-//create object 
-ZigduinoTransfer ET;  
- 
-struct SEND_DATA_STRUCTURE{ 
-  //put your variable definitions here for the data you want to send 
-  //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO 
-  int blinks; 
-  int pause; 
-}; 
- 
-//give a name to the group of data 
-SEND_DATA_STRUCTURE mydata; 
- 
-void setup(){ 
-  Serial.begin(9600); 
-  //start the library, pass in the data details 
-  ET.begin(details(mydata)); 
-   
-  pinMode(11, OUTPUT); 
-   
-   
-   
-} 
- 
-void loop(){ 
-  //this is how you access the variables. [name of the group].[variable name] 
-  mydata.blinks = 5; 
-  mydata.pause = 10; 
-  //send the data 
-  ET.sendData(); 
-   
-  //Just for fun, we will blink it out too 
-   for(int i = mydata.blinks; i>0; i--){ 
-      digitalWrite(11, HIGH); 
-      delay(mydata.pause * 100); 
-      digitalWrite(11, LOW); 
-      delay(mydata.pause * 100); 
-    } 
-   
-  delay(5000); 
-} 
-</code> 
- 
-Codul pentru Receiver: 
- 
-<code C> 
-#include <ZigduinoTransfer.h> 
- 
-//create object 
-ZigduinoTransfer ET;  
- 
-struct RECEIVE_DATA_STRUCTURE{ 
-  //put your variable definitions here for the data you want to receive 
-  //THIS MUST BE EXACTLY THE SAME ON THE OTHER NODE!!! 
-  int blinks; 
-  int pause; 
-}; 
- 
-//give a name to the group of data 
-RECEIVE_DATA_STRUCTURE mydata; 
- 
-void setup(){ 
-  Serial.begin(9600); 
-  //start the library, pass in the data details   
-  ET.begin(details(mydata)); 
-   
-  pinMode(11, OUTPUT); 
-   
-} 
- 
-void loop(){ 
-  //check and see if a data packet has come in.  
-  if(ET.receiveData()){ 
-    //this is how you access the variables. [name of the group].[variable name] 
-    //since we have data, we will blink it out.  
-    for(int i = mydata.blinks; i>0; i--){ 
-      digitalWrite(11, HIGH); 
-      delay(mydata.pause * 100); 
-      digitalWrite(11, LOW); 
-      delay(mydata.pause * 100); 
-    } 
-  } 
-   
-  //you should make this delay shorter than your transmit delay or else messages could be lost 
-  delay(250); 
-} 
-</code> 
  
-<note>**Task 0:** Rulați exemplele de mai sus.</note> 
-<note>**Task 1:** Modificați structura de date pentru a conține urmatoarele câmpuri: adresa nodului care face transmisia (un octet), sequence number pentru transmisie (doi octeți) și payload (32 octeți). Trimiteți mesaje și afișati-le pe serială.</note> 
-<note>**Task 2:** Modificați biblioteca pentru a permite transmisia bidirecțională de date.</note> 
  
sparrow_v4.1443449482.txt.gz · Last modified: 2015/09/28 17:11 by dan.tudose