Consigli per iniziare a programmare da zero.

Ciao a tutti, sono Giovanni. Mi sono appena iscritto in questo forum perché voglio cimentarmi nella programmazione e nella realizzazione di vari progetti. Partiamo dal presupposto che le mie competenze nel campo della programmazione sono pari a zero poiché frequento il liceo scientifico. Nonostante ciò voglio iniziare a programmare. Ho cercato qualcosa, ma non ho trovato soluzioni complete. Quindi chiedo a voi veterani qualche consiglio per iniziare da zero. Per la programmazione avevo iniziato a leggere il libro della Apogeo di Deitel C. "Corso completo di programmazione" . Però prima di procedere e spendere tempo nello studio, volevo chiedervi qualche consiglio su come iniziare. Se necessario sono disposto anche a leggere libri in inglese. Vi ringrazio per il tempo che mi dedicherete e mi scuso se ho sbagliato sezione. Buona serata Giovanni

Il libro che hai sicuramente è un buon libro, ma da solo non basta, occorre anche un IDE per testare il codice. Arduino in questo caso non aiuta perché non è lo strumento adatto ad imparare il linguaggio C, il motivo principalmente è legato al fatto che devi trasferire il programma nella flash del micro, flash che ha un numero di scritture limitato oltre il quale risulta impossibile il trasferimento causa errore.

Quindi si impara il C sul PC e lo si tiene sempre pronto per testare del codice. Presa confidenza con il C puoi anche usare arduino per sperimentare hardware e software, ma considera che nel PC c'è il sistema operativo che fa i miracoli, nel micro c'è solo il tuo programma e niente sistema operativo, cioè per fare un esempio con il C puoi scegliere a caso un indirizzo di memoria e scriverci qualcosa, sul PC interviene il sistema operativo che ti impedisce l'operazione, su arduino non interviene nessuno, quindi totale controllo da parte del programmatore.

Nota che arduino ha scelto il linguaggio C++, largamente compatibile con il C, tanto che un tempo il C++ si chiamava C con oggetti. Adesso invece si dice del C++ che sia il più performante linguaggio orientato agli oggetti.

Ciao.

Quindi il tuo consiglio è di imparare prima bene a programmare sul PC e poi andare avanti con Arduino? Se si, non ho ben capito se meglio iniziare con il C o con il C++. Grazie mille

Imparare prima il C su pc ok, ma per farci cosa? Imparare a fare A+B, stampare variabili a video? creare un database e leggerlo? imparare a scrivere una libreria? La scheda arduino e il C/c++ sono una cosa unica, tutto il software si sviluppa intorno ad un oggetto hardware con tanti fili e tanti lumini, dispaly, pulsanti, transistor, ricevitori, timer, shield vari ..... se non carico il mio C su arduino che contiene istruzioni per far funzionare le sue periferiche e vederle funzionare con i miei occhi .... cosa posso fare sul PC?

Per me devi incominciare caricando il tuo C subito su arduino e vederne i risulatati, provare e riprovare, compilare e ricompilare. Copiare esempi base e modificarli per studiarne gli effetti, chiedere se hai dubbi, cercare in rete . Io ho scritto la flash della mia MEGA almeno 20-30 volte al giorno per 3 anni ed è ancora li che li prende, non sapevo nulla di C, venivo da altri tipi di programmazione.... comunque se anche dopo 2 anni il mio arduino non ce la fa più a ricevere scritture poco importa, penso di essermelo ripagato e di sicuro quello nuovo non soffrirà come il primo :).

Quindi un ragazzino deve fare esperienze con una bambola .... poi una volta pronto può uscire con una ragazza vera? ahahahha perchè il concetto è quello ....

Per me dovresti incominciare subito con arduino.

ciao

Quindi il tuo consiglio è di imparare prima bene a programmare sul PC e poi andare avanti con Arduino? Se si, non ho ben capito se meglio iniziare con il C o con il C++. Grazie mille

Seguendo un libro sul C++ imparerai anche parte del linguaggio C a cui mancano gli oggetti. Quindi puoi partire studiando il C con il PC, e ti sarà sufficiente per scrivere codice funzionante su arduino. Poi visto che le librerie e parte del core sono stati implementati sfruttando il paradigma di programmazione orientato agli oggetti fornito dal C++ dovrai acquisire un minimo di informazioni sulle "classi" C++. Venendo dalla esperienza del C sarai avvantaggiato nello studio del C++, in quanto come ho detto prima il C++ si può chiamare "C con classi".

Più che imparare il linguaggio come prima cosa dovresti acquisire delle informazioni generiche su come funzionano questi linguaggi detti "compilati" a differenza di quelli "interpretati".

Se ti chiedessi: Posso usare l'asm dentro il codice scritto in C/C++? Tu forse non sapresti cosa è asm. A livello generico sapere cosa è e come funziona un assemblatore di linguaggio asm e fattibile e aiuta a farsi un quadro generico.

C'è chi come @pablos ha iniziato direttamente con arduino, ma io lo sconsiglio e consiglio anche a lui di avere sempre pronto il C/C++ sul PC per sperimentare codice che se funziona verrà portato sulla piattaforma Arduino. Io continuo ad eseguire lo sviluppo parallelo tra PC e Arduino che mi torna utilissimo in moltissimi casi e mi evita centinaio di scritture flash solo perché il codice che ho scritto non lo giudico sufficientemente flessibile, pratico, elegante, comprensibile ecc, con un occhio di riguardo nei confronti della efficienza che in arduino viste le risorse limitate è un obbligo.

Differenze tra PC e Arduino: Ad esempio printf sul pc funziona in modo completo, su arduino printf non accetta le variabili float, in quanto sono disabilitate perché consumano molto spazio flash, ma si possono abilitare. Altre differenze si scoprono durante lo studio, lo heap, lo stack, i thread ecc.

Ciao.

Innanzitutto voglio ringraziarvi entrambi... Pablos è la stessa cosa che mi stavo chiedendo io. Programmo sul PC, ma cosa? E poi quante volte si può flashare la memoria? Da quanto ho capito tu l'avrai fatto qualche migliaio di volte ahahahahaha.

MauroTec: Più che imparare il linguaggio come prima cosa dovresti acquisire delle informazioni generiche su come funzionano questi linguaggi detti "compilati" a differenza di quelli "interpretati".

Se ti chiedessi: Posso usare l'asm dentro il codice scritto in C/C++? Tu forse non sapresti cosa è asm. A livello generico sapere cosa è e come funziona un assemblatore di linguaggio asm e fattibile e aiuta a farsi un quadro generico.

...

Differenze tra PC e Arduino: Ad esempio printf sul pc funziona in modo completo, su arduino printf non accetta le variabili float, in quanto sono disabilitate perché consumano molto spazio flash, ma si possono abilitare. Altre differenze si scoprono durante lo studio, lo heap, lo stack, i thread ecc.

Ciao.

Ecco qua, di quello che hai scritto qui non ho capito una mazza... Ed è a questo che mi riferisco. Io voglio imparare a programmare, ma voglio prima capire perchè, e poi realizzare le cose ( certo che se man mano che vado avanti riesco a rellizzare qualcosa ben venga, non so se mi sono spiegato).Altrimenti non ci vuole niente, mi trovo il codice su internet e lo copio. Oltre poi alla programmazione mi servono anche le basi dell'elettronica. A scuola a breve studieremo i circuiti in corrente continua, ma più che altro da un punto di vista strettamente teorico. Quindi ricapitolando il libro che ho iniziato va bene, giusto?

Ciao gio-amm,

io ho iniziato a studiare poco tempo fa.

Ti consiglio il libro "Arduino. Progetti e soluzioni" costa molto, ma ti assicuro che è davvero utilissimo.

E' talmente completo e ricco di esempi (700 pagine !) che dopo poco ti si chiariscono tanti dubbi.

Un caro saluto

Grazie a tutti per i consigli, per ora inizierò a programmare qualcosa sul pc, usando gli esempi ed esercizi del libro poi tra qualche settimana, spero non troppo, comprerò un arduino... Però mi occorrerebbe anche qualche libro sull' elettronica-elettrotecnica (cioè qualcosa la so, ma al livello della formula per calcolare le resistenze in parallelo, quindi una cippa :drooling_face:)...

Grazie a tutti per i consigli, per ora inizierò a programmare qualcosa sul pc, usando gli esempi ed esercizi del libro poi tra qualche settimana, spero non troppo, comprerò un arduino... Però mi occorrerebbe anche qualche libro sull' elettronica-elettrotecnica (cioè qualcosa la so, ma al livello della formula per calcolare le resistenze in parallelo, quindi una cippa :drooling_face:)...

Anche per la materia elettronica/elettrotecnica prima di iniziare a leggere un libro, ti do lo stesso consiglio, cioè fatti una idea delle parti coinvolte. Quindi Arduino board: Cosa c'è su sta scheda? Ok c'è un micro Atmel, bene scarico il datasheet, ok sti c...i più di 500 pagine, diamo una sbirciata superficiale, ok vedo flash, ram ed eeprom, ok nella flash c'è il mio programma, nella ram le variabili, e nella eeprom ci scrivo dati che non voglio perdere quando spengo tutto. Vediamo le periferiche. Vediamo i limiti, ok un pin non può fornire più di 40mA ok, aspetta sono dati limite, quindi meglio stare 30% sotto, un momento 40mAx14uscite mi sembra troppo ah si massimo 200mA prelevati da Vcc.

Insomma un poco di buon senso e metodo, rendono l'impresa meno ardua. Fortunatamente con arduino non serve essere un Ingegnere elettronico per accendere dei led e fare giare un motorino o eccitare un relè, complice anche il fatto che ci sono in rete molti esempio (alcuni errati), comunque il forum è qui apposta.

Ciao.

Maurotec, quello che dici è completamente giusto e rispecchia quasi totalmente le mie intenzioni, ma la mia domanda è: dove le prendo ste cose? Come hai detto tu il datasheet dell'atmel sono 500 pagine e di certo non posso mettermi a studiare da un libro di ingegneria elettronica, perché non capirei una mazza... So che sono un rompiscatole, ma potresti darmi tu qualche indicazione di cosa e da dove studiare? Considera che vado allo scientifico e devo imparare tutto da solo... Grazie mille per la pazienza:-D

Maurotec, quello che dici è completamente giusto e rispecchia quasi totalmente le mie intenzioni, ma la mia domanda è: dove le prendo ste cose? Come hai detto tu il datasheet dell'atmel sono 500 pagine e di certo non posso mettermi a studiare da un libro di ingegneria elettronica, perché non capirei una mazza... So che sono un rompiscatole, ma potresti darmi tu qualche indicazione di cosa e da dove studiare? Considera che vado allo scientifico e devo imparare tutto da solo... Grazie mille per la pazienza:-D

Intanto leggi il datasheet è cerca di capire come è organizzato il documento, non devi pretendere di capire tutto, ma almeno acquisti familiarità, dico questo sempre in riferimento al discorso fatto prima, cioè quali sono le parti coinvolte? Conoscerle è già un qualcosa in più che non averne percezione assoluta. In un programma informatico "le parti" vengono chiamate "attori", quando si sviluppa la prima fase è quella di identificarli e molte volte non appaiono espliciti, averli identificati chiaramente è un traguardo non da poco.

Io non riesco a fornirti delle indicazioni nell'ordine corretto, ma in ordine sparso. Avere nella propria mente il concetto di elettricità più aderente alla realtà sarebbe il primo passo, quindi una capatina su fisica atomica la si deve fare, anche online.

La legge di ohm, da capire come capisci che alla cassa ti hanno dato 10 cents meno. Il mondo reale e quello ideale, quindi la differenza tra componenti reali e ideali e da qui la volontà di esprimere tramite modello matematico il comportamento reale del componente in modo più fedele possibile.

Comunque due libri 1° e 2° (elettrotecnica) 3° (elettronica) anno industriale contengono le basi e da li con il tempo e la riflessione come andare avanti lo capisci da te.

Potresti anche tentare di affrontare inizialmente lo studio con risorse online, se decidi così, posta il link e chiedi: é affidabile questa risorsa?

In questo modo si può favorire altri utenti che perseguono il tuo stesso intento.

Ciao.

gio-amm: Grazie a tutti per i consigli, per ora inizierò a programmare qualcosa sul pc, usando gli esempi ed esercizi del libro poi tra qualche settimana, spero non troppo, comprerò un arduino... Però mi occorrerebbe anche qualche libro sull' elettronica-elettrotecnica (cioè qualcosa la so, ma al livello della formula per calcolare le resistenze in parallelo, quindi una cippa :drooling_face:)...

  • Sono un programmatore diplomato, a scuola facemmo poco di elettronica. Io ho letto questo libro in inglese: Charles Platt " Make electronics" http://www.amazon.com/Make-Electronics-Discovery-Charles-Platt/dp/0596153740

  • Per il C su Arduino può essere utile due pdf interessanti di una prof. che li ha messi a disposizione della comunity. Cerca con google "Tiziana Marsella Programmare Arduino", dovresti trovare un pdf e poi ne noterai anche un altro.

  • Per provare a programmare in C/C++ su PC ti consiglio il DevC++ che è free e "semplice" http://www.bloodshed.net/download.html

  • Il libro che ti ha suggerito @Zamundo è ottimo ma secondo me meglio se prima impari un pò le basi. Inoltre quel libro in italiano costa 50 euro circa, mentre in inglese "Arduino Cookbook" costa solo 35 euro. 15 euro per la traduzione è un FURTO. Io l'ho comprato in inglese ed addirittura usato su abeboooks http://www.abebooks.it/ Vedi però se conviene rispetto a prezzo per uno nuovo.

Pablos è la stessa cosa che mi stavo chiedendo io. Programmo sul PC, ma cosa?
Quello che segue è una funzione testata sul PC, una volta funzionante nel dettaglio la passo direttamente nel progetto arduino, senza alcuna modifica di adattamento.

Credimi di codice da testare prima di passarlo ad arduino c’è n’è tanto, conoscendo bene il C/C++ puoi anche simulare una ISR chiamata ogni secondo. Ovviamente se non ci si pone il problema delle differenze tra PC è arduino si fa presto a non capirci nulla, ad esempio su arduino un float è grande 4 byte, sul PC è grande 8 byte.

typedef struct {
    float semiperiodWidth;
    uint8_t stepWidth;
    uint8_t ocrn;

} DataMainVoltage;

DataMainVoltage mv;
void calcOcrn(uint8_t fRete) {

    mv.semiperiodWidth = (1.0/fRete) / 0.000002;
    mv.stepWidth = mv.semiperiodWidth / STEP_RESOLUTION;
    mv.ocrn = mv.stepWidth / (TC * TIMER0_PRESCALER);
    printf("ocrn * (TC * TIMER0_PRESCALER) * STEP_RESOLUTION = %d\n", (uint32_t)(mv.ocrn * (TC * TIMER0_PRESCALER) * 180) );
    // ocrn * (TC * TIMER0_PRESCALER) * STEP_RESOLUTION
}

Ciao.