Ciao a tutti, è la prima volta che programmo con Arduino.
Sto utilizzando la scheda Arduino uno wifi.
Sto iniziando a fare un programma che dovrebbe campionarmi un segnale a 256hz con il timer2, sul canale 0, e riempirmi un buffer da 256 valori. quando il buffer è pieno dovrebbe inviare tramite wifi al determinato ip e alla determinata porta il pacchetto.
Il problema è che non riesco neanche a visualizzare l'output sulla porta seriale...
A compilare compila come si deve, ho caricato il programma, tutto ok, ma il monitor seriale mi rimane bianco.
Grazie per l'aiuto
#include
<compat/deprecated.h>
#include <FlexiTimer2.h>
#include <WiFiLink.h>
//http://www.arduino.cc/playground/Main/FlexiTimer2
// All definitions
#define SAMPFREQ 256 // ADC sampling rate 256
#define TIMER2VAL (1024/(SAMPFREQ)) // Set 256Hz sampling frequency
#define LED1 13
// Global constants and variables
volatile unsigned char CurrentCh = 0; //Current channel being sampled.
volatile unsigned char counter = 0; //Additional divider used to generate CAL_SIG
volatile unsigned int ADC_Value = 0; //ADC current value
volatile unsigned int i=0 ;
uint8_t buffer[256];
//wifi variables
char ssid[] = "*********"; // your network SSID (name)
char pass[] = "*********"; // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0; // your network key Index number (needed only for WEP)
int status = WL_IDLE_STATUS;
// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
IPAddress server(192,168,2,118); // numeric IP for Google (no DNS)
// char server[] = "www.google.com"; // name address for Google (using DNS)
// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
WiFiClient client;
//~~~~~~~~~~
// Functions
//~~~~~~~~~~
void Toggle_LED1(void){
if((digitalRead(LED1))==HIGH){ digitalWrite(LED1,LOW); }
else{ digitalWrite(LED1,HIGH); }
}
void setup() {
noInterrupts(); // Disable all interrupts before initialization
// WI-FI PORT CONFIGURATION
Serial.begin(9600);
//Set speed to 115200 bps
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
//Check if communication with wifi module has been established
if (WiFi.status() == WL_NO_WIFI_MODULE_COMM) {
Serial.println("Communication with WiFi module not established.");
while (true); // don't continue:
}
// attempt to connect to Wifi network:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
Serial.println("Connected to wifi");
printWifiStatus();
Serial.println("\nStarting connection to server...");
// if you get a connection, report back via serial:
if (client.connect(server, 8888)) {
Serial.println("connected to server");
}
// LED1
pinMode(LED1, OUTPUT); //Setup LED1 direction
digitalWrite(LED1,LOW); //Setup LED1 state
// Timer2
// Timer2 is used to setup the analag channels sampling frequency and packet update.
// Whenever interrupt occures, the current read packet is sent to the PC
// In addition the CAL_SIG is generated as well, so Timer1 is not required in this case!
FlexiTimer2::set(TIMER2VAL, Timer2_Overflow_ISR);
FlexiTimer2::start();
// MCU sleep mode = idle.
//outb(MCUCR,(inp(MCUCR) | (1<<SE)) & (~(1<<SM0) | ~(1<<SM1) | ~(1<<SM2)));
interrupts(); // Enable all interrupts after initialization has been completed
}
/****************************************************/
/* Function name: Timer2_Overflow_ISR */
/* Parameters */
/* Input : No */
/* Output : No */
/* Action: Determines ADC sampling frequency. */
/****************************************************/
void Timer2_Overflow_ISR()
{
// Toggle LED1 with ADC sampling frequency /2
Toggle_LED1();
ADC_Value = analogRead(CurrentCh);
buffer[i] = ADC_Value;
i++;
if (i == 256) {
Serial.println("Hello World");
client.write(buffer,256);
}
}
void loop() {
__asm__ __volatile__ ("sleep");
}
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
Benvenuto. Essendo il tuo primo post, nel rispetto del regolamento, ti chiediamo cortesemente di presentartiQUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO... Grazie.
Qui una serie di link utili, non inerenti al tuo problema:
Ti chiedo scusa, ero di fretta... mi sono appena presentato!
Ho provato a togliere quella riga di codice ma è uguale.
Ho provato a inserire questa riga di codice:
void setup() {
noInterrupts(); // Disable all interrupts before initialization
Serial.begin(9600);
Serial.print("Communication with WiFi module not established.");
}
void loop() {
}
E il monitor mi da come output solo l'inizio della stringa "Co"
Se provo mettere il serial print nel loop invece mi viene scritto completamente a ripetizione,
ho provato ad inserire anche un delay nel loop, ma non funziona.
ora funziona, era la funzione noInterrupts(); a bloccare tutto...
ora la domanda è questa, nel setup prima di configurare i vari blocchi è necessario disattivare tutti gli interrupt?
visto che disattiva anche l'output seriale...
Emperon:
ora la domanda è questa, nel setup prima di configurare i vari blocchi è necessario disattivare tutti gli interrupt?
Dipende ...
... normalmente NO (... ma possono esserci casi particolari in cui NON si vuole che le ISR vengano chiamate prima di un dato punto) e, ovviamente, con gli interrupt disabilitati, tutto ciò che dipende da interrupt NON funziona e ... la seriale è gestita tramire interrupt (... e non solo lei, varie cose del "core Arduino" lo sono)!
gpb01:
Dipende ...
... normalmente NO (... ma possono esserci casi particolari in cui NON si vuole che le ISR vengano chiamate prima di un dato punto) e, ovviamente, con gli interrupt disabilitati, tutto ciò che dipende da interrupt NON funziona e ... la seriale è gestita tramire interrupt (... e non solo lei, varie cose del "core Arduino" lo sono)!
Guglielmo
Grazie per la risposta Guglielmo.
Nel mio caso ho preso l'esempio del setup del timer2 per campionare un dato ogni volta che c'è interrupt.
E' necessario in questo caso? Se sì come posso fare in modo che almeno la seriale mi visualizzi gli output??
Grazie
No, non è necessario, anche perché sei TU che decidi quando attivare il Timer2 (FlexiTimer2::start();) ...
... comunque guarda che ... con tutto quell'HW collegato è completamente inutile complicarsi la vita e mettere in sleep la MCU ... NON hai alcun risparmio energetico significativo, visto che TUTTO il resto dell'HW (scheda di rete inclusa) è attivo ed alimentato :
Ok ora funziona tutto. Sto cercando di far funzionare la comunicazione wifi dell'arduino uno wifi.
ho incluso la libreria wifilink come richiesto e configurato in questo modo
void setup() {
Serial.begin(9600);
// attempt to connect to Wifi network:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
Serial.print(status);
delay(10000);
}
Serial.println("Connected to wifi");
printWifiStatus();
Serial.println("\nStarting connection to server...");
// if you get a connection, report back via serial:
if (client.connect(server, 8888)) {
Serial.println("connected to server");
}
FlexiTimer2::set(TIMER2VAL, Timer2_Overflow_ISR);
FlexiTimer2::start();
}
solo che l'output mi rimane bloccato a
Attempting to connect to SSID: (nome mia rete wifi)
Ho letto su internet che bisognerebbe aggiornare il firmware della scheda per farlo funzionare...
C'è un modo per vedere che firmware è installato sulla mia scheda e se c'è bisogno di aggiornarlo?
...\Arduino\libraries\WiFi_Link\src\utility\wifi_drv.cpp: In static member function 'static uint8_t WiFiDrv::getEncTypeNetowrks(uint8_t)':
...\Arduino\libraries\WiFi_Link\src\utility\wifi_drv.cpp:453:10: warning: converting to non-pointer type 'uint8_t {aka unsigned char}' from NULL [-Wconversion-null]
return NULL;
^
forse non riesce a connettersi perché la credenziali le legge nel formato sbagliato
Se hai usato una scheda wifi originale arduino, la corretta libreria è la WiFi (#include <WiFi.h>) ... non so cosa sia la libreria "wifilink" :
Per provare che la scheda WiFi Arduino funzioni, usa uno degli esempi che sei trovano nella apposita sezione dell'IDE. Solo se non dovesse andare con gli esempi allora puoi pensare di doverla aggiornare.
gpb01:
Se hai usato una scheda wifi originale arduino, la corretta libreria è la WiFi (#include <WiFi.h>) ... non so cosa sia la libreria "wifilink" :
Per provare che la scheda WiFi Arduino funzioni, usa uno degli esempi che sei trovano nella apposita sezione dell'IDE. Solo se non dovesse andare con gli esempi allora puoi pensare di doverla aggiornare.
Guglielmo
La scheda Arduino Uno Wifi ha il wifi integrato senza bisogno di shield.
Ho incluso la wifilink perché da come stavo leggendo la libreria wifi standard viene utilizzata in abbinamento alla shield, per l'ultimo arduino con il wifi integrato c'è la wifilink....
Ora provo con l'altra
Ah ... NON conosco Arduino Uno WiFi ... è uno dei prodotti fatti da Arduino.org e, anche se le due organizzazioni, dopo gli ultimi annunci, dovrebbero diventare una cosa unico, al momento questo è il forum di Arduino.cc e la maggior parte di noi ha esperienza solo sulle schede prodotte da Arduino.cc e non conosce quelle di Arduino.org ...
Molto probabilmente è meglio che chiedi sul forum di Arduino.org ... :