Sei sulla pagina 1di 7

Uso delle librerie Arduino su apparecchiature SYEL

La famiglia di schede Arduino mette a disposizione sul web una vasta serie di librerie per moltissimi chips di
diversi tipi e funzioni, generalmente sviluppate come classi C++.

I controllers SYEL della serie Pineapple e Puzzle sono predisposti per eseguire codice nativo C++ Arduino.
Poiché il codice delle librerie di Arduino è in linguaggio C++ questo viene compilato e linkato separatamente
e gira nel task PLC, condividendo con il resto del progetto le variabili volute.

Prendiamo in considerazione l’ esempio più semplice possibile, ovvero “Blink” che fa lampeggiare un’ uscita
dell’ apparecchiatura.
Vedremo come gestire il codice Arduino e come integrarlo con il resto del progetto, sviluppato con Proteus
in ambiente grafico con linguaggio C.

1. Aprire il project manager selezionando l’ icona relativa


2. Impostare il progetto Pieapple
3. Selezionare “Other Options”

Apparirà la finestra delle opzioni di Proteus.


Nel campo C++ Form scrivere il nome del main di Arduino.
Si tratta di un file con estensione “.INO “ che deve contenere:

extern "C" //definizione delle variabili da condividere con


//il resto del programma Proteus in linguaggio C
{
……
}
void setup() //inizializzazione del task Arduino
{
……
}
void loop() //loop del task Arduino
{
……
}
Nell’ esempio abbiamo definito il file “Blink.ino” che dovrà essere creato nella directory del progetto ad
esempio con il blocco note. Volendo esiste già il file base.ino che contiene già setup() e loop() vuoti.
Una volta creato sarà editabile nella shell di Proteus insieme a tutte le librerie eventualmente incluse.

Nel nostro esempio:

extern "C"
{
volatile U32 time; //variabile usata in Page1 del progetto
extern U32 pippo; //variabile usata in Page1 del progetto
}

// the setup function runs once when you press reset or power the board
void setup()
{
pinMode(13, OUTPUT); // initialize digital pin 13 as an output.
}

// the loop function runs over and over again forever


void loop()
{
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(time); // wait for a second
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
delay(time); // wait for a second
}

Nell’ esempio si fa riferimento al pin 13. I pin usabili con pinMode, digtalWrite e digitalRead sono definiti
solo per apparecchiature PINEAPPLE e PINEAPPLE800. Per altri hardware dovremo usare altre funzioni.

Le funzioni che fanno riferimento ai pin di Pineapple sono:

void pinMode(U8 n,U8 mode);


void digitalWrite(unsigned int n,unsigned int level);
void analogWrite(unsigned int n,int level);
int digitalRead(unsigned int n);
unsigned short int analogRead(unsigned int n);
U8 shiftIn(U8 dataPin, U8 clockPin, U8 bitOrder);
void shiftOut(U8 dataPin, U8 clockPin, U8 bitOrder, U8 val);
U8 shiftInOut(U8 dataInPin, U8 dataOutPin, U8 clockPin, U8 bitOrder, U8 val);
unsigned long pulseIn(U8 pin, U8 state, U32 timeout);
void analogReference(int source);
void attachInterrupt(U8 interruptNum, void (*userFunc)(void), int mode);
void detachInterrupt(U8 interruptNum);
void randomSeed(unsigned long seed);
long random(long howbig);
long map(long x, long in_min, long in_max, long out_min, long out_max);
Le funzioni equivalenti che possono essere usate per qualsiasi hardware sono:

void set_external_interrupt(unsigned char port,unsigned char pin,unsigned char


up_down,void *sub);
void assign_interrupt(void *sub,unsigned char port,unsigned char pin,unsigned char
up_down);
void assign_output(unsigned char num,unsigned char port,unsigned char pin);
void assign_input(unsigned char num,unsigned char port,unsigned char pin);
void mode_output(unsigned char port,unsigned char pin,unsigned int mode);
void mode_input(unsigned char port,unsigned char pin,unsigned int mode);
void refresh_outputs(unsigned int);
void refresh_inputs(unsigned int);
int assign_pwm(unsigned int num,unsigned char port,char pin);
int max_pwm(unsigned int num);
int assign_adc(unsigned char num,unsigned char port,unsigned char pin);
int assign_dac(unsigned char port,unsigned char pin);
int assign_com(unsigned char num,unsigned char port,unsigned char pin);
unsigned short read_adc(unsigned char num);
int set_dac(unsigned short val);
int set_pwm(unsigned char num,unsigned short val);
void enable_dac(void);
void enable_com1(void);
void enable_com2(void);
int adc_mode(unsigned int time_digits,unsigned char mode,void *adc_buffer);
int dac_mode(unsigned int time,unsigned char mode,void *dac_buffer);

Queste funzioni non fanno riferimento ai pin di Arduino ma consentono di utilizzare qualsiasi pin del
controller facendo riferimento al numero del pin e al numero della porta. A tale scopo occorre
evidentemente conoscere la mappatura degli i/o del controller che usiamo.

Nel file C:\COMMONS\C\armgcc2\arm-none-eabi\include\db4_pineapple.h è possibile trovare la


definizione di tutte le funzioni e di tutte le macro usabili a tale scopo.

Usando le librerie di Arduino occorre tener conto inoltre del fatto che esistono diverse versioni di Arduino,
con CPU diverse e mappature degli i/o diverse, per cui potrà essere necessario ritoccare il codice per farlo
corrispondere al nostro hardware.
La soluzione più semplice è di utilizzare la scheda Syel Pineapple che è pin-to-pin compatibile con
Arduino UNO, per cui non è necessaria alcuna modifica al codice Arduino.

Il Pineapple base consiste in una scheda basata su un processore CORTEX-M3 con 32 MBytes di
SDRAM, 512 KBYTES di FLASH, 96 KBYTES di SRAM, 2 KBYTES di EEPROM, un realtime clock, un
display TFT 480x272 pixels a 32000 colori con touch-screen.
Un connettore posteriore garantisce la piena compat ibilità pin-to-pin con ARDUINO-UNO ( 31 pins ) , ed è
espanso per supportare altre funzioni e periferiche:
Oltre al display TFT, le periferiche aggiunte sono: un controller ETHERNET 10-100, Un controller WI-FI, un
nodo CAN-CANOPEN, una seconda porta RS-232 ed una porta RS-485, un lettore di carte SD-MMC, un
lettore di penne USB, un lettore di carte NFC, un accelerometro a 3 assi, una porta BLUETOOTH e una
sonda termometrica.
Il connettore USB può essere usato per alimentare la scheda ( 5 Volts. )
Sul connettore posteriore possono essere montate schede Arduino-compatibili ed altre schede dedicate
che aggiungono altre funzioni.
compatibilità Arduino:
14 pin interrupt
8 pin ADC
4 pin PWM
4 pin SPI
2 pin I2C
2 pin COM1 TTL
rispetto ad Arduino:
6 pin non hanno interrupt
2 pin non hanno PWM
funzioni aggiunte:
5 pin interrupt
7 pin GPIO
2 pin COM2 TTL
2 pin RS-485
2 pin CAN
6 pin ETHERNET(*)
1 pin DAC
periferiche abilitate per default all' accensione:
LCD DISPLAY (480 x 272 pixels)
TOUCH SCREEN (resistive)
SD MEMORY (SD-SDHC)
USB PEN PORT
RS-485 PORT
CAN NODE PORT
ETHERNET/WIFI(*) (selezionabile da config)
periferiche assegnabili ed abilitabili via software (sui 27 pins GPIO **)
27 digital inputs (27 pins)
27 digital outputs (27 pins)
19 edge interrupt (19 pins)
4 PWM (4 pins)
6 ADC 12 bit (8 pins)
2 COM RS-232 (TTL)(4 pins)
1 DAC (1 pin)
altre periferiche sui pins del connettore gestibili via software(**)
1 Hi speed SPI master-slave (3 + n pins)
1 I2C master-slave (2 pins)
altri dispositivi gestibili via software (non sui pins del connettore)
1 NFC card reader (internal spi)
1 BLUETOOTH master-slave (internal spi)
1 ACCELEROMETER 3 AXES (internal spi)
2 TEMPERATURE SENSORS (internal spi + external spi)
(*) La porta Ethernet richiede un connettore ethernet esterno RJ-45.
(**)Livelli di tensione sui pins del connettore:
Ingressi digitali: 0-3.3V (5 Volts tolerant)
Uscite digitali: 0-3.3V
Ingressi analogici: 0-3.3V (v.ref)
Uscita analogica: 0-3.3V.
Porte RS-232: TTL 0.3.3V (DATA_IN 5V. tolerant)
Le porte RS-232 richiedono all' occorrenza un RS-232/TTL converter.

Un progetto importato da Arduino contiene in genere un colloquio con la console seriale usando le funzioni:

Serial.begin()
Serial.read()
Serial.print()
Serial.println()

Il colloquio seriale può essere gestito in una finestra di Proteus:


 Nel setup() del programma Arduino scrivere:
Serial.begin(9600);
 Creare un pannello
 Nel pannello inserire una label (il testo è irrilevante)
 Nell’ evento on_entry della label scrivere il seguente testo:
show_serial_console(panelxx,txx);
dove panelxx è il nome del pannello e txx è il tempo di refresh (in genere 100 mSec.).

l’ esempio adc_read_full mostra questa gestione della console seriale.


Nel task C++ Arduino può essere inclusa qualsiasi libreria di Arduino.
Le librerie disponibili già incluse sono:

 arduino_serial.h"
 SPI.cpp"
 WIRE.cpp"
 SERIALS.h"

Potrebbero piacerti anche