PySimEd:Arduino

Z kiwiki
Prejsť na: navigácia, hľadanie

Arduino as Remote Measuring and Control Platform for pse

Platforma Arduino je použitá ako vstupno - výstupné rozhranie pre zber dát a riadenie. S programom pse komunikuje cez sériové rozhranie rýchlosťou 230400 Bd jednoduchým Master - Slave protokolom. Algoritmus vyhodnotenia dát a riadenia je implementovaný pomocou blokov programu pse. Program v Arduine prijme povel, nastaví hodnoty na výstupoch (digitálne výstupy, PWM, časovače pre serva), načíta dáta zo vstupov (analógové a digitálne vstupy) a odošle odpoveď.

V najjednoduchšej verzii Arduino nespracovavá dáta z povelu (okrem úpravy formátu), pri zmene konfgurácie Audurina je potrebné príslušným spôsobom modifikovať aj komunikačný blok v pse.

Examples

Arduino program

/* Communication Arduino <-> pse-0.07
   Version   0.2
   Date      22.11.2014
 
  Packet - receive, setup values
  [0] - address (default - 0x55)
  [1] - digital out (default - 4 bits)  
  [2] - analog out 0 - pwm
  [3] - analog out 1 - pwm
  [4] - servo 0 - H
  [5] - servo 0 - L
  [6] - servo 1 - H
  [7] - servo 1 - L
 
  Packet - send, read values
  [0] - address (default 0x55)
  [1] - analog in 0 - H
  [2] - analog in 0 - L
  [3] - analog in 1 - H
  [4] - analog in 1 - L
  [5] - digital in (default - 4 bits)
 
*/
 
#include <Servo.h> 
 
// Arduino system configuration
// Pin numbers
 
const int D_OUT_0 = 2;      // Digital outputs
const int D_OUT_1 = 4;      
const int D_OUT_2 = 7;      
const int D_OUT_3 = 8;     
 
const int D_IN_0  = 11;     // Digital inputs
const int D_IN_1  = 12;
const int D_IN_2  = 13;
const int D_IN_3  = 3;
 
const int AN_IN_0 = A0;     // Analog inputs
const int AN_IN_1 = A1;
 
const int AN_OUT_0 = 5;     // Analog outputs (PWM)
const int AN_OUT_1 = 6;
 
const int SERVO_0  = 9;        // Servo control (PWM)
const int SERVO_1  = 10;
 
// Global variables
int addr = 0x55;
 
word in_0;
word in_1;
byte data_in;
 
char buffer[8];
int byteReads=0;
 
Servo servo_0;
Servo servo_1;
 
void setup()
{
  // initialize the serial communication:
  Serial.begin(230400);
 
  servo_0.attach(SERVO_0);
  servo_1.attach(SERVO_1);
 
  // initialize digital output port
  pinMode(D_OUT_0, OUTPUT);
  pinMode(D_OUT_1, OUTPUT);
  pinMode(D_OUT_2, OUTPUT);
  pinMode(D_OUT_3, OUTPUT);
 
  pinMode(D_IN_0, INPUT);
  pinMode(D_IN_1, INPUT);
  pinMode(D_IN_2, INPUT);
  pinMode(D_IN_3, INPUT);
 
  analogWrite(AN_OUT_0, 0);
  analogWrite(AN_OUT_1, 0);
}
 
void loop() {
 
  // check if data has been sent from the computer:
  if (Serial.available()){
    byteReads = Serial.readBytes(buffer, 8);   
  }
  else{
    // set flag
    buffer[0]=0x00; 
  }
 
  // check received data
  if (byteReads == 8 && buffer[0] == addr){
 
    // set pwm
    analogWrite(AN_OUT_0, buffer[2]);
    analogWrite(AN_OUT_1, buffer[3]);
 
    // set digital pins
    digitalWrite(D_OUT_0,  buffer[1] & 0x01      );
    digitalWrite(D_OUT_1, (buffer[1] & 0x02) >> 1);
    digitalWrite(D_OUT_2, (buffer[1] & 0x04) >> 2);
    digitalWrite(D_OUT_3, (buffer[1] & 0x08) >> 3);
 
    in_0 = analogRead(AN_IN_0);
    in_1 = analogRead(AN_IN_1);
 
    servo_0.writeMicroseconds( (byte(buffer[4]) << 8)  | byte(buffer[5]) );
    servo_1.writeMicroseconds( (byte(buffer[6]) << 8)  | byte(buffer[7]) );
 
    data_in = byte(digitalRead(D_IN_3)) << 3  | byte(digitalRead(D_IN_2)) <<2 | \
              byte(digitalRead(D_IN_1)) << 1  | byte(digitalRead(D_IN_0));
 
    Serial.write(addr);
    Serial.write((in_0 & 0xFF00) >> 8 );    // high byte
    Serial.write( in_0 & 0x00FF);
    Serial.write((in_1 & 0xFF00) >> 8 );
    Serial.write( in_1 & 0x00FF);
    Serial.write(data_in);
  }
}
Osobné nástroje
Menné priestory

Varianty
Operácie
Navigácia
Rýchle linky
Nástroje
Tlačiť/exportovať