Programmazione

Salve a tutti, spero che possiate aiutarmi al più presto, dovrei eseguire un file sul pc utilizzando arduino; mi spiego meglio, vorrei che quando avvio lo sketch in questione, venga eseguito un file (audio) sul pc. Ci sono riuscito con C++ con il seguente codice che su arduino non funziona:

#include <stdlib.h>
#include<stdio.h>

int main()
{
(void)system("C:\Windows\System32\XXXX.mp3");
return(0);
}


Aiutatemiiii grazie!

allora, arduino non viene programmato in C ma in simil C. più vicino al processing.
Arduino non ha su montato nessun sistema windows, linux, mac o che tu voglia, non ha SO.
quesslo che tu hai scritto inanzitutto prende 2 librerie inutili nell'arduino (stdlib e stdio).
poi hai usato un return(0) inutile visto che non è un programma eseguibile
in fine l'errore più grande: (void)system("C:\Windows\System32\XXXX.mp3");
ora ti spiego.
la programmazione è vastissima e si applica in base allo scopo.
questo significa che un programma che scrivi per windows ovviamente non funzionerà su MAC ma anche che un programma che sia multipiattaforma non funzionerà su un arduino.
arduino è un microcontrollore non un pc, un pc ha necessità di un SO e i programmi che scrivi vengono interpretati dal SO non dal processore, arduino è un processore alla fine.
non hai un sistema e windows, non hai dischi quindi non esiste il disco C:, non esiste la cartella Windows e non esiste il comando system().
arduino non vuole inoltre int come funzione principale (main()) ma un void.
poi da dove riprodurresti l'audio? arduino non ha un paio di casse e se non lo scrivi tu dal codice non ha nemmeno un codec mp3.
per riprodurre un suono su arduino dovresti inanzitutto metterlo su una SD esterna perchè non hai disco e quello che viene salvato nella flash interna è solo il codice (poi mi pare che hai solo 20kb quindi metterci un MP3 non mi pare il caso), poi dovresti creare un codec mp3 che legga il file da SD ne estrapoli la cassa destra e sinistra e leggere le frequenze che poi dovresti dare come output su 2 canali PWM di arduino.
visto la blasfemia di codice che hai scritto non avventurarti subito così avanti, inizia a far lampeggiare un led, poi magari effetti come quello di kitt di supercar tramite un PCF8574 (via I2C) o uno shift register, poi passa a cose sempre più complicate come leggere un file .txt da una sdcard e stamparlo tramite seriale sul serial monitor e poi pian piano portai arrivare a quello che vuoi fare ora.

non scoraggiarti ma quello che vuoi fare tu ora figurati che è molto complicato per molti programmatori esperti :wink:

@superlol: attento che hai detto un po' di...inesattezze pure tu.

@giando: ammetto che non ho capito praticamente nulla di ciò che intendi, ti sei spiegato in modo troppo stringato...

ho capito solo che vuoi far partire un mp3 sul tuo computer ...ma cosa vuol dire quando avvii uno sketch?
Poi cosa vuol dire che ci sei riuscito con C++ ma che non funziona su arduino?

Se ci dai un'idea di cosa vuoi fare sarebbe già un buon punto di partenza per cercare di aiutarti! :wink: :wink:

dato che l'mp3 e l'hardware necessario alla riproduzione dell'mp3 risiede sul computer, tutto ciò che può fare arduino è inviare un comando (via seriale) che un programma sul pc riconosce e lancia l'apposito comando ( per esempio system("C:\Windows\System32\XXXX.mp3"); )

Quindi ti serve un programma sul pc che legga la seriale e in base al comando ricevuto faccia partire mp3 o quel che vuoi, e un'arduino che invii i comandi.

Scusatemi forse mi sono spiegato male. Dunque il codice che ho postato è funzionante con dev c++ e mi permette di eseguire il file "XXXX.mp3" nel momento in cui apro l'eseguibile creato da dev c++. Ora mi chiedevo se per il software di arduino (e non sto parlando di hardware, processori e quant'altro passi nella tua fantasia @superlol) esista qualche funzione o codice particolare per ottenere lo stesso risultato che ho ottenuto con DevC. Faccio un esempio di ciò che voglio fare: Quando premo il tasto "a" esegui il file XXXX.mp3 presente sul computer ovviamente , quando premo il tasto "b" esegui il file YYYY.mp3 ecc.... Il problema non è quello di associare i tasti ( case ) bensì quello di eseguire il file presente sul computer. è possibile?.. grazie
@federico spero di essermi spiegato, aspetto tuoi suggerimenti, grazie!
@lesto forse hai capito il mio problema, ma a che tipo di programma ti riferisci? grazie!

Dunque vediamo se ho capito... hai fatto un programma sul pc che in base al tasto che premi ti fa partire un mp3 e vorresti farlo fare anche ad arduino. Se è così non è poi molto difficile, basta che sul programma residente sul pc abiliti anche la comunicazione seriale, poi ci penserà arduino ad inviarti un carattere o una stringa sulla seriale del pc che ti farà partire l'mp3 da te scelto in qualche maniera su arduino (un'altra tastiera, dei pulsanti, in modo random ogni certa ora...)
Esempio pratico: schiacci il tasto A sulla tastiera e parte l'mp3 numero 1; se metti il programma anche in ascolto sulla seriale e gli arriva il carattere 'A', il programma sul pc sa che dovrà lanciare l'mp3 numero 1, senza che usi la tastiera del pc, e così via per gli altri tasti.

giando:
Scusatemi forse mi sono spiegato male. Dunque il codice che ho postato è funzionante con dev c++ e mi permette di eseguire il file "XXXX.mp3" nel momento in cui apro l'eseguibile creato da dev c++. Ora mi chiedevo se per il software di arduino (e non sto parlando di hardware, processori e quant'altro passi nella tua fantasia @superlol) esista qualche funzione o codice particolare per ottenere lo stesso risultato che ho ottenuto con DevC. Faccio un esempio di ciò che voglio fare: Quando premo il tasto "a" esegui il file XXXX.mp3 presente sul computer ovviamente , quando premo il tasto "b" esegui il file YYYY.mp3 ecc.... Il problema non è quello di associare i tasti ( case ) bensì quello di eseguire il file presente sul computer. è possibile?.. grazie
@federico spero di essermi spiegato, aspetto tuoi suggerimenti, grazie!
@lesto forse hai capito il mio problema, ma a che tipo di programma ti riferisci? grazie!

allora.
Quello che tu vuoi fare è un ponte tra i pulsanti e il PC.
Arduino legge il tasto, in base al tasto premuto invia un comando (che ti inventi tu) al pc (via seriale).
Quì ci sta un altro tuo programma (c++, java, processing o quello che vuoi) che legge il comando, e esegue l'azione corrispondente.
fine :slight_smile:

arduino non può agire direttamente sul computer, devi immaginartelo come se fosse un computer a parte.

il tuo codice non funziona perchè:

  1. arduino non usa il main() ma setup() e loop() (in realtà il main() è nel bootloader, che poi richiama setup e loop)
  2. la chiamata System è una funzione di sistema, che arduino non ha
  3. arduino non può agire direttamente sul PC: non può direttamente aprire un file o avviare un'applicazione sul PC, l'unico contatto che può avere è la comunicazione seriale.
  4. se anche avessi caricato l'mp3 su arduino, e creato la funzione System, l'mp3 sarebbe suonato dall'arduino, non dal PC

il punto 3 dice che non puoi agire direttamente: ma nulla ti vieta di inventarti un protocollo (ovvero una serie di comandi, o meglio un'insieme di regole) che via seriale ti permettano di accedere e/o modificare file, lanciare applicazioni e quant'altro. Però servirà sempre la mediazione di un programma sul PC che sia in grado di capire il tuo protocollo e eseguire le azioni corrispondenti.

il tuo codice non funziona perchè:

  1. arduino non usa il main() ma setup() e loop() (in realtà il main() è nel bootloader, che poi richiama setup e loop)

Non è esatto, il main c'è (ma non si vede), ed è parte delle librerie C++ di arduino, da questo main nascosto vengono effettuate le chiamate a setup e loop, la chiamata a loop è all'interno di un loop infinito.

Per il resto concordo su tutto, anche sul fatto che facciamo tutti un pò fatica a capire quello che vuoi fare, ma questo accade quando si da qualcosa per scontato.

Provo a semplificare, anche se dovrebbe essere già chiaro:

L'unico modo di far suonare un file su pc avviandolo da un'altro pc è collegare i due pc, come non è importante, ciò che i due pc si scambiano sono sempre messaggi, nudi e crudi pacchetti di bit. Sul pc ci sono installati dei sistemi operativi che fanno le magie, alcune di queste permettono di fare chiamate di sistema su host remoti.

Su arduino e in generale su piattaforma di sviluppo hardware/software non c'è nulla di tutto questo. Ma c'è l'essenziale per comunicare con il pc. Sul playground ed anche nell'ide c'è una libreria generica chiamata firmata, questa usa un protocollo preso in prestito dal MIDI. Tramite firmata chiamando delle funzioni (queste inviano dati ad arduino) puoi manipolare le porte di arduino, oppure da arduino chiami delle funzioni di firmata (che inviano dati al pc) per fagli fare quello che vuoi tu a tua scelta.

Mi pare di capire che con il C o devc non hai problemi?

Ciao a tutti, @pelletta hai capito perfettamente è proprio ciò che volevo fare! :wink:
@lesto grazie mille per la risposta, ora ho capito!
Oggi pomeriggio ci proverò e vi farò sapere.. grazie a tutti

@lesto ho seguito il procedimento che hai postato.
Ora la situazione è questa: Arduino legge il tasto, in base al tasto premuto invia il comando al pc (via seriale), Processing legge il comando, e a questo punto mi manca il codice per eseguire il comando che ero riuscito a far funzionare con Dev-C++ (quello di eseguire il file sul pc).
Questo è lo sketch di Processing:

import processing.serial.*;
Serial myPort; // Create object from Serial class
int val; // Data received from the serial port
void setup()
{
size(200, 200);
String portName = Serial.list()[0];
myPort = new Serial(this, "COM4", 9600);
}

void draw()
{
if ( myPort.available() > 0) { // If data is available,
val = myPort.read(); // read it and store it in val
}

if (val == 3) { // If the serial value is 3,
open("C:\Windows\System32\1.JPG"); }
}

Chi sa dirmi qual'è la funzione da inserire al posto di quella evidenziata in rosso? Grazieee

http://processing.org/learning/basics/loaddisplayimage.html

doh! sapevo che poteva ingannare l'estenzione jpg in "C:\Windows\System32\1.JPG" :slight_smile: il file che dovevo eseguire è un mp3 non un immagine, Sorry :slight_smile: mi posteresti il link per eseguire mp3? grazie :wink:

http://processing.org/discourse/yabb2/YaBB.pl?num=1159134008
trovi tutto quello che ti serve sul sito processing, prova col tasto "search" :grin:

Risolto con l'esempio Load Snippet (per suoni brevi), grazie... ciao