User Tools

Site Tools


workshop

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
workshop [2014/07/05 01:22]
dan.tudose [Transmisia radio]
workshop [2014/10/27 12:44] (current)
dan.tudose
Line 103: Line 103:
  
 Sparrow v3 este nodul senzorial folosit în cadrul laboratorului de //Wireless Sensor Networks// şi este echipat cu trei tipuri de senzori: temperatură, umiditate și luminozitate ambientală. Acesta dispune de un microcontroller Atmega128RFA1, care încorporează un transmiţător radio conform cu standardul IEEE 802.15.4, peste care se poate implementa popularul protocol Zigbee. Sparrow v3 este nodul senzorial folosit în cadrul laboratorului de //Wireless Sensor Networks// şi este echipat cu trei tipuri de senzori: temperatură, umiditate și luminozitate ambientală. Acesta dispune de un microcontroller Atmega128RFA1, care încorporează un transmiţător radio conform cu standardul IEEE 802.15.4, peste care se poate implementa popularul protocol Zigbee.
 +
 +<imgcaption sparrowv3 | Nodul senzorial Sparrow v3.2>{{ :sparrowv3.png |}}</imgcaption>
  
 ==== Zigduino ==== ==== Zigduino ====
Line 113: Line 115:
 Pentru a introduce suportul de Zigduino în Arduino IDE este nevoie să se urmeze paşii de mai jos: Pentru a introduce suportul de Zigduino în Arduino IDE este nevoie să se urmeze paşii de mai jos:
  
-1. Se instalează Arduino IDE: http://www.arduino.cc/en/Main/Software (versiunea 1.0.5 - Zigduino-1.0 este compatibil doar cu Arduino-1.0x); +  - Se instalează Arduino IDE: http://www.arduino.cc/en/Main/Software (versiunea 1.0.5 - Zigduino-1.0 este compatibil doar cu Arduino-1.0x); 
- +  Se descarcă arhiva Zigduino-1.0: https://github.com/logos-electromechanical/Zigduino-1.0; 
-2. Se descarcă arhiva Zigduino-1.0: https://github.com/logos-electromechanical/Zigduino-1.0; +  Se înlocuieşte folder-ul //Arduino\hardware\tools\avr// cu //Zigduino-1.0-new-extension\hardware\tools\avr//; 
- +  Se copiază în //Arduino\hardware\arduino\cores// folder-ul //Zigduino-1.0-new-extension\hardware\arduino\cores\zigduino//; 
-3. Se înlocuieşte folder-ul //Arduino\hardware\tools\avr// cu //Zigduino-1.0-new-extension\hardware\tools\avr//; +  Se înlocuieşte fişierul //Arduino\hardware\arduino\boards.txt// cu //Zigduino-1.0-new-extension\hardware\arduino\boards.txt//; 
- +  Se copiază în //Arduino\hardware\arduino\variants// folder-ele //zigduino _r1// şi //zigduino_r2// din //Zigduino-1.0-new-extension\hardware\arduino\variants//
-4. Se copiază în //Arduino\hardware\arduino\cores// folder-ul //Zigduino-1.0-new-extension\hardware\arduino\cores\zigduino//; +
- +
-5. Se înlocuieşte fişierul //Arduino\hardware\arduino\boards.txt// cu //Zigduino-1.0-new-extension\hardware\arduino\boards.txt//; +
- +
-6. Se copiază în //Arduino\hardware\arduino\variants// folder-ele //zigduino _r1// şi //zigduino_r2// din //Zigduino-1.0-new-extension\hardware\arduino\variants//.+
  
 După aceşti paşi ar trebui să fie vizibile doua intrări pentru Zigduino în //Tools->Boards// (în meniul Arduino IDE). După aceşti paşi ar trebui să fie vizibile doua intrări pentru Zigduino în //Tools->Boards// (în meniul Arduino IDE).
Line 194: Line 191:
 </code> </code>
  
-În programul de mai sus se observă folosirea unor macrouri: DDRC și PORTC. Acestea sunt expandate de compilator în locația de memorie unde este mapat registrul de I/O respectiv.+În programul de mai sus se observă folosirea unor macrouri: DDRB și PORTB. Acestea sunt expandate de compilator în locația de memorie unde este mapat registrul de I/O respectiv. 
 + 
 +Alternativ, puteți folosi funcțiile de bibliotecă Arduino: 
 + 
 +<code C> 
 +/* 
 + * Blink 
 + * 
 + * The basic Arduino example.  Turns on an LED on for one second, 
 + * then off for one second, and so on...  We use pin 13 because, 
 + * depending on your Arduino board, it has either a built-in LED 
 + * or a built-in resistor so that you need only an LED. 
 + * 
 + * http://www.arduino.cc/en/Tutorial/Blink 
 + */ 
 +  
 +  
 +int ledPin = 11;                // LED (PB5) connected to digital pin 11 
 +  
 +void setup()                    // run once, when the sketch starts 
 +
 +  pinMode(ledPin, OUTPUT);      // sets the digital pin as output 
 +
 +  
 +  
 +void loop()                     // run over and over again 
 +
 +  digitalWrite(ledPin, HIGH);   // sets the LED on 
 +  delay(1000);                  // waits for a second 
 +  digitalWrite(ledPin, LOW);    // sets the LED off 
 +  delay(1000);                  // waits for a second 
 +
 +</code>
  
 Pentru a compila şi executa codul de mai jos pe un nod Sparrow folosind Arduino IDE paşii sunt următorii: Pentru a compila şi executa codul de mai jos pe un nod Sparrow folosind Arduino IDE paşii sunt următorii:
Line 216: Line 245:
 --*// --*//
  
-Led-urile sunt legate la portul B, pinii PB5, PB6 și PB7.</note>+Led-urile sunt legate la portul B, pinii PB5, PB6 și PB7 (pinii 11, 10, respectiv 9 pentru Arduino).</note>
  
  
Line 269: Line 298:
 } }
 </code> </code>
 +
  
 ===== Comunicația serială ===== ===== Comunicația serială =====
Line 318: Line 348:
  
 <code C> <code C>
 +int controlPin = 7; //sensor ON/OFF control pin (PE7)
 +
 void setup() { void setup() {
-  DDRE |= 1<<PE7; //sensor on/off control+   
 +  pinMode(controlPin, OUTPUT) //sensor on/off control 
 +  
   // initialize the serial communication:   // initialize the serial communication:
   Serial.begin(9600);   Serial.begin(9600);
Line 325: Line 359:
    
 void loop() { void loop() {
-  PORTE &= ~(1<<PE7); //enable all sensors+  digitalWrite(controlPin, LOW); //enable all sensors 
 +  
 +  // wait a bit for the analog-to-digital converter 
 +  // to stabilize after the last reading: 
 +  delay(100); 
 +  
   // send the value of analog input 0:   // send the value of analog input 0:
   Serial.println(analogRead(A0));   Serial.println(analogRead(A0));
      
-  PORTE |= (1<<PE7); //disable all sensors+  digitalWrite(controlPin, HIGH); //disable all sensors
      
-  // wait a bit for the analog-to-digital converter + 
-  // to stabilize after the last reading: +
-  delay(100);+
 } }
 </code> </code>
Line 343: Line 380:
 <imgcaption light | Senzorul de lumină și schema de conectare la microcontroller> {{ :light.png |}}</imgcaption> <imgcaption light | Senzorul de lumină și schema de conectare la microcontroller> {{ :light.png |}}</imgcaption>
 <note>**Task 1:** Senzorul de lumină este conectat la canalul A2. Citiți valoarea acestuia și trimiteți-o pe serială.</note> <note>**Task 1:** Senzorul de lumină este conectat la canalul A2. Citiți valoarea acestuia și trimiteți-o pe serială.</note>
- 
 ==== Senzorul digital de temperatură și umiditate ==== ==== Senzorul digital de temperatură și umiditate ====
  
Line 362: Line 398:
  
 <code C> <code C>
-#include "sht21b.h"+#include "sht21.h"
    
 float temp, humid; float temp, humid;
Line 398: Line 434:
 </code> </code>
  
-===== Transmisia radio =====+===== Afișarea datelor de la senzori cu Processing =====
  
-Pentru a folosi transceiver-ul radio cu care sunt dotate nodurile senzoriale, vom utiliza o bibliotecă scrisă pentru Arduino ce ne va smplifica foarte mult codulAceastă bibliotecă se numește ZigduinoRadio și poate fi descărcată de {{::zigduinoradio_201111130010.zip|aici}}+în exemplul de mai jos vom vedea cum putem să trimitem un octet de date de la placa Sparrow la PC și să afișam grafic rezultatulComunicația se va face peste interfața serială, dar datele vor fi preluate de către un alt program care va fi responsabil pentru desenarea graficului pe ecran.
  
-Instalarea bibliotecii este foarte facilă, trebuie doar să dezarhivați arhiva în //Arduino\libraries//+Bineînțeles, puteți folosi Serial Monitor ca și până acum pentru a vizualiza datele în formă textdar pentru a le afișa sub formă grafică avem nevoie de Processing. Puteți să descărcați programul de aici: http://processing.org/download 
 +Pur și simplu dezarhivați în directorul Arduino și rulați fișierul .exe
  
-Mai jos aveți un exemplu care vă permite să trimiteți și să recepționați date de pe interfața radio.+Încărcați următorul program pe placa Sparrow:
  
 <code C> <code C>
-/+int controlPin = 7; //sensor ON/OFF control pin (PE7)
- +
-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() {
- +
-void setup() +
-{ +
-  ZigduinoRadio.begin(11); +
-  Serial.begin(9600);+
      
-  ZigduinoRadio.attachError(errHandle); +  pinMode(controlPin, OUTPUT);  //sensor on/off control
-  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()) +  // initialize the serial communication: 
-  +  Serial.begin(9600); 
-    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"); +
-  }+
    
 +void loop() {
 +  digitalWrite(controlPin, LOW); //enable all sensors
 + 
 +  // wait a bit for the analog-to-digital converter
 +  // to stabilize after the last reading:
 +  delay(100);
      
-  delay(1000);+  // send the value of analog input 0: 
 +  Serial.println(analogRead(A2)); 
 +   
 +  digitalWrite(controlPin, HIGH); //disable all sensors 
 +   
 + 
 } }
 +</code>
  
-void errHandle(radio_error_t err) +După cum puteți vedea, programul trimite pe serială datele citite de la senzorul de lumină
-+Pentru a le afișa în mod grafic, încărcați următoarea schiță în Processing:
-  Serial.println(); +
-  Serial.print("Error"); +
-  Serial.print((uint8_t)err, 10); +
-  Serial.println(); +
-}+
  
-void onXmitDone(radio_tx_done_t x) +<code C> 
-+// Graphing sketch 
-  Serial.println(); +  
-  Serial.print("TxDone"); +  
-  Serial.print((uint8_t)x10); + // This program takes ASCII-encoded strings 
-  Serial.println(); + // from the serial port at 9600 baud and graphs them. It expects values in the 
-}+ // range 0 to 1023, followed by a newline, or newline and carriage return 
 +  
 + // Created 20 Apr 2005 
 + // Updated 18 Jan 2008 
 + // by Tom Igoe 
 + // This example code is in the public domain. 
 +  
 + import processing.serial.*; 
 +  
 + Serial myPort;        // The serial port 
 + int xPos = 1;         // horizontal position of the graph 
 +  
 + void setup () { 
 + // set the window size: 
 + size(400, 300);         
 +  
 + // List all the available serial ports 
 + println(Serial.list()); 
 + // I know that the first port in the serial list on my mac 
 + // is always my  Arduino, so I open Serial.list()[0]. 
 + // Open whatever port is the one you're using. 
 + myPort = new Serial(this, Serial.list()[3], 9600); 
 + // don't generate a serialEvent() unless you get a newline character: 
 + myPort.bufferUntil('\n'); 
 + // set inital background: 
 + background(0); 
 + } 
 + void draw () { 
 + // everything happens in the serialEvent() 
 + } 
 +  
 + void serialEvent (Serial myPort) { 
 + // get the ASCII string: 
 + String inString = myPort.readStringUntil('\n'); 
 +  
 + if (inString != null
 + // trim off any whitespace: 
 + inString = trim(inString); 
 + // convert to an int and map to the screen height: 
 + float inByte = float(inString); 
 + inByte = map(inByte, 0, 1023, 0height); 
 +  
 + // draw the line: 
 + stroke(127,34,255); 
 + line(xPos, height, xPos, height - inByte); 
 +  
 + // at the edge of the screen, go back to the beginning: 
 + if (xPos >= width) { 
 + xPos = 0; 
 + background(0); 
 + } 
 + else { 
 + // increment the horizontal position: 
 + xPos++; 
 + } 
 + } 
 + } 
 +  
 +  
 +  
 +/* Max/MSP v5 patch for this example 
 + ----------begin_max5_patcher---------- 
 +1591.3oc0YszbaaCD9r7uBL5RalQUAO3CvdyS5zVenWZxs5NcfHgjPCIfJIT 
 +RTxj+6AOHkoTDooroUs0AQPR73a+1cwtK3WtZxzEpOwqlB9YveAlL4KWMYh6 
 +Q1GLo99ISKXeJMmU451zTUQAWpmNy+NM+SZ2y+sR1l02JuU9t0hJvFlNcMPy 
 +dOuBv.U5Rgb0LPpRpYBooM3529latArTUVvzZdFPtsXAuDrrTU.f.sBffXxL 
 +vGE50lIHkUVJXq3fRtdaoDvjYfbgjujaFJSCzq4.tLaN.bi1tJefWpqbO0uz 
 +1IjIABoluxrJ1guxh2JfPO2B5zRNyBCLDFcqbwNvuv9fHCb8bvevyyEU2JKT 
 +YhkBSWPAfq2TZ6YhqmuMUo0feUn+rYpY4YtY+cFw3lUJdCMYAapZqzwUHX8S 
 +crjAd+SIOU6UBAwIygy.Q1+HAA1KH6EveWOFQlitUK92ehfal9kFhUxJ3tWc 
 +sgpxadigWExbt1o7Ps5dk3yttivyg20W0VcSmg1G90qtx92rAZbH4ez.ruy1 
 +nhmaDPidE07J+5n2sg6E6oKXxUSmc20o6E3SPRDbrkXnPGUYE.i5nCNB9TxQ 
 +jG.G0kCTZtH88f07Rt0ZMMWUw8VvbKVAaTk6GyoraPdZff7rQTejBN54lgyv 
 +HE0Ft7AvIvvgvIwO23jBdUkYOuSvIFSiNcjFhiSsUBwsUCh1AgfNSBAeNDBZ 
 +DIDqY.f8.YjfjV1HAn9XDTxyNFYatVTkKx3kcK9GraZpI5jv7GOx+Z37Xh82 
 +LSKHIDmDXaESoXRngIZQDKVkpxUkMCyXCQhcCK1z.G457gi3TzMz4RFD515F 
 +G3bIQQwcP3SOF0zlkGhiCBQ1kOHHFFlXaEBQIQnCwv9QF1LxPZ.A4jR5cyQs 
 +vbvHMJsLll01We+rE2LazX6zYmCraRrsPFwKg1ANBZFY.IAihr8Ox.aH0oAL 
 +hB8nQVw0FSJiZeunOykbT6t3r.NP8.iL+bnwNiXuVMNJH9H9YCm89CFXPBER 
 +bz422p8.O4dg6kRxdyjDqRwMIHTbT3QFLskxJ8tbmQK4tm0XGeZWF7wKKtYY 
 +aTAF.XPNFaaQBinQMJ4QLF0aNHF0JtYuHSxoUZfZY6.UU2ejJTb8lQw8Fo5k 
 +Rv6e2PI+fOM71o2ecY1VgTYdCSxxUqLokuYq9jYJi6lxPgD2NIPePLB0mwbG 
 +YA9Rgxdiu1k5xiLlSU6JVnx6wzg3sYHwTesB8Z5D7RiGZpXyvDNJY.DQX3.H 
 +hvmcUN4bP1yCkhpTle2P37jtBsKrLWcMScEmltOPv22ZfAqQAdKr9HzATQwZ 
 +q18PrUGt6Tst2XMCRUfGuhXs6ccn23YloomMqcTiC5iMGPsHsHRWhWFlaenV 
 +XcqwgCQiGGJzptyS2ZMODBz6fGza0bzmXBj7+DA94bvpR01MffAlueO7HwcI 
 +pWCwmzJdvi9ILgflLAFmyXB6O7ML0YbD26lenmcGxjVsZUN+A6pUK7AtTrPg 
 +M+eRYG0qD9j4I7eEbco8Xh6WcO.or9XDC6UCiewbXHkh6xm5LiPEkzpJDRTu 
 +mEB44Fgz4NCtJvX.SM1vo2SlTCZGAe7GZu6ahdRyzFOhYZ+mbVVSYptBw.K1 
 +tboIkatIA7c1cTKD1u.honLYV04VkluHsXe0szv9pQCE9Ro3jaVB1o15pz2X 
 +zYoBvO5KXCAe0LCYJybE8ZODf4fV8t9qW0zYxq.YJfTosj1bv0xc.SaC0+AV 
 +9V9L.KKyV3SyTcRtmzi6rO.O16USvts4B5xe9EymDvebK0eMfW6+NIsNlE2m 
 +eqRyJ0utRq13+RjmqYKN1e.4d61jjdsauXe3.2p6jgi9hsNIv97CoyJ01xzl 
 +c3ZhUCtSHx3UZgjoEJYqNY+hYs5zZQVFW19L3JDYaTlMLqAAt1G2yXlnFg9a 
 +53L1FJVcv.cOX0dh7mCVGCLce7GFcQwDdH5Ta3nyAS0pQbHxegr+tGIZORgM 
 +RnMj5vGl1Fs16drnk7Tf1XOLgv1n0d2iEsCxR.eQsNOZ4FGF7whofgfI3kES 
 +1kCeOX5L2rifbdu0A9ae2X.V33B1Z+.Bj1FrP5iFrCYCG5EUWSG.hhunHJd. 
 +HJ5hhnng3h9HPj4lud02.1bxGw. 
 +-----------end_max5_patcher----------- 
 +  
 + */
 </code> </code>
 +
 +La prima rulare vi se va afișa o listă cu porturi COM disponibile, aveți grijă să selectați portul pe care este conectată placa Sparrow. Pentru aceasta va trebui probabil să modificați programul de mai sus și să îl re-rulați.
 +
 +Datele eșantionate de la senzorul de lumină ar trebui să fie vizibile în fereastra deschisă de către schița Processing.
 +
 +<imgcaption processing | Graficul afișat de la senzor în fereastra Processing>{{ :processing.png |}}</imgcaption>
 +
 +
 +
 +
workshop.1404512557.txt.gz · Last modified: 2014/07/05 01:22 by dan.tudose