https://fablabgenova.it/api.php?action=feedcontributions&user=SuperSte&feedformat=atomFabLabGenovaWiki - User contributions [en]2024-03-29T08:22:06ZUser contributionsMediaWiki 1.27.7https://fablabgenova.it/index.php?title=Main_Page&diff=826Main Page2014-06-17T06:50:40Z<p>SuperSte: /* Annuncio importante: */</p>
<hr />
<div>[[File:sgombero.jpg|380px|right|thumb|Dettaglio del portone della sede di L.S.O.A. Buridda la mattina dello sgombero.]]<br />
<br />
==Annuncio importante:==<br />
<br />
Sabato 14 Giugno, dopo dieci giorni di manifestazioni ed iniziative, in seguito allo [[annuncio_sgombero | sgombero del 4 Giugno]], ha preso vita la '''Street Parade'' della Città di Sotto, un corteo pensato per rivendicare tutti i movimenti di autogestione e dissenso presenti nella città di Genova.<br />
<br />
Questa "parata" si è conclusa con l'occupazione dello stabile dell'ex-magistero in corso Montegrappa 39, che ospiterà i laboratori del Buridda; questa nuova occupazione non è affatto un punto di arrivo ma piuttosto un nuovo inizio: nonostante lo spazio sia ottimo e funzionale per le attività presenti nel vecchio edificio di via Bertani, tutto è da ricostruire partendo da quelle aree che permettono alla Buridda di vivere e senza le quali il FabLab Genova così come lo conosciamo non sarebbe mai potuto nascere. <br />
<br />
La mole di lavoro necessaria per rendere nuovamente agibile l'edificio è enorme e richiederà il contributo di tutti.<br />
<br />
'''Fintanto che questi primi lavori non saranno conclusi non sentiamo di poter riprendere l'attività del FabLab''' in senso stretto, ma invitiamo chiunque creda nel nostro progetto a partecipare alle assemblee collettive che si terranno il '''lunedì sera''' e ad aiutare nei lavori di riorganizzazione.<br />
<br />
'''La nostra speranza è quella di poter rendere nuovamente disponibile il servizio che abbiamo dato alla città nel più breve tempo possibile.'''<br />
<br />
Per sapere di più o offrirci il tuo aiuto, '''contattaci a [mailto:info@fablabgenova.it info@fablabgenova.it]'''<br />
<br />
[[http://youtu.be/aX7biR45jfQ video del fablab dopo lo sgombero]]<br />
<br />
----<br />
----<br />
<br />
{{#ev:youtube|p75GlubbOGg|300|right|Video Promo per il nostro primo compleanno}}<br />
<br />
== Come partecipare ==<br />
Il laboratorio e' aperto '''gratuitamente''' al pubblico e mette a disposizione di chiunque le competenze di diverse persone esperte in diversi ambiti (meccanica, informatica, fisica, chimica, elettronica). Il solo "obbligo" per gli utenti e' di condividere le proprie esperienze e le propire capacita' con gli altri utenti. Grazie a questa interazione chiunque puo' realizzare fisicamente le proprie idee anche senza avere le competenze necessarie, visto che le competenze sono distribuite tra gli utenti. Durante l'orario di apertura c'e' sempre in laboratorio qualcuno disponibile ad aiutare nella realizzazione di qualsiasi progetto e a mostrare come utilizzare correttamente e in sicurezza i diversi macchinari (stampanti 3D, fresa CNC, tornio, saldatrice, trapano a colonna, sega circolare, etc...).<br />
<br />
=== Orari di apertura ===<br />
<br />
'''A seguito dello sgombero del LSOA Buridda il laboratorio del FabLab Genova non è più accessibile a nessuno fino a data da destinarsi. Abbiamo salvato alcune macchine, riapriremo presto, contateci!'''<br />
<br />
Una volta riaperto, saremo aperti al pubblico tutti i '''Martedi'''' e '''Giovedi'''' sera a partire dalle '''20.00''' e '''Domenica''' pomeriggio a partire dalle '''16.00'''<br />
<br />
Negli altri giorni e orari e' consigliato concordare via mail [mailto:info@fablabgenova.it info@fablabgenova.it]<br />
<br />
=== Dove siamo ===<br />
Il laboratorio è ospitato all'interno del LSOA Buridda <strike>in '''via Bertani 1''' a Genova. [https://www.google.com/maps?t=m&ll=44.4122321,8.9369363&q=Via+Agostino+Bertani mappa]</strike><br />
<br />
Attualmente non abbiamo più una sede vera e propria, ma presto torneremo ad averla. Stay tuned!<br />
<br />
== [[Progetti]] ==<br />
<br />
Il '''FabLab''' è prima di tutto un laboratorio grazie al quale è possibile realizzare i propri progetti. Il nostro obiettivo è mettere a disposizione metodi di '''prototipazione rapida''' che rendano veloce e possibile il processo di realizzazione di nuove tecnologie da parte di amatori e aziende.<br />
Per fare ciò lavoriamo costantemente alla produzione di macchinari, attrezzature e software totalmente open-source che potete trovare alla pagina "[[Progetti]]", sempre aggiornata per i Makers che ci seguono.<br />
<br />
== Attrezzatura ==<br />
==== Strumenti a disposizione ====<br />
Di seguito la lista degli spazi e degli strumenti disponibili per tutti gli utenti, questi sono suddivisi all'interno di tre stanze: una officina, una stanza dedicata all'elettronica e alla creazione di circuiti stampati ed una terza (l'ingresso) dove vengono effettutati workshop e attività di brainstorming.<br />
Per gli strumenti che richiedono maggiori conoscenze di base e/o specifici accorgimenti è disponibile una pagina "WorkFlow". Un '''WorkFlow''' è una spiegazione dettagliata della procedura necessaria al corretto utilizzo di una determinata attrezzatura.<br />
Se vuoi utilizzare uno dei nostri macchinari per la prima volta ti consigliamo caldamente di leggere la pagina ad esso collegata. <br />
<br />
<br />
'''Prototipazione Rapida''' [[File:Postazione3Dprinter.jpg|400px|thumb|right|Postazione stampa 3D]]<br />
* Makerbot Cupcake 3D printer<br />
* RepRap Mendel Prusa 3D printer<br />
* mini fresa CNC Roland iModela IM-01<br />
* [[Fresa CNC]] a tre assi -> [[WorkFlow Fresa CNC]]<br />
* Tutto il necessario all'incisione di PCB single-layer<br />
<br />
<br />
'''Software di modellazione 3D'''<br />
* SketchUp<br />
* Blender<br />
* ProE<br />
* Autocad<br />
* OpensCad<br />
* FreeCad<br />
* Rhino3D<br />
* [[MeshLab]]<br />
<br />
<br />
'''Elettronica''' [[File:postazione_elettronica.JPG|400px|thumb|right|Postazione elettronica]]<br />
* Alimentatore stabilizzato Delta E030-10 <small>[http://83.117.57.34/nvhr/Delta_E030-10.pdf datasheet]</small><br />
* Saldatori a stilo <br />
* Saldatori a gas<br />
* Oscilloscopio<br />
* Generatore di segnali<br />
* Analizzatore di spettro<br />
<br />
<br />
'''Lavorazione metalli''' [[File:Postazione metalli.JPG|400px|thumb|right|Postazione metalli]]<br />
* Trapano a colonna<br />
* Saldatrice inverter ad arco<br />
* [[Puntatrice]]<br />
* Morsa dritta in acciaio<br />
* Tornio DM Edison<br />
* Mola circolare<br />
* Flessibile Ø 115<br />
* Flessibile Ø 230<br />
* [[Fornace fusione metalli]]<br />
<br />
<br />
'''Lavorazione legno''' [[File:postazioneLegno.jpg|400px|thumb|right|Postazione legno]]<br />
* Sega circolare<br />
* Sega a nastro Black & Deker DN330<br />
* Seghetto alternativo<br />
* Sega a banco<br />
* Seghe manuali dritte e ad arco<br />
* Pialla elettrica<br />
* Pialla manuale<br />
<br />
<br />
'''Produzione PCB'''<br />
* Stampante laser A4 b/n<br />
* Laminatrice a caldo<br />
* mini fresa CNC Roland iModela IM-01<br />
* bancone di incisione per ossidazione acida<br />
<br />
'''Compressore'''<br />
<br />
==== Consumabili ====<br />
Quella di seguito è la lista di consumabili che facciamo in modo che non manchino mai in lab.<br />
<br />
Molto spesso chi li usa lascia poi un contributo per il riapprovigionamento, altrimenti risolviamo (come per tutto il resto) con l'autotassazione.<br />
<br />
Se quindi volete farci un regalo poco impegnativo, ma ben accetto, sceglietelo pure da questa lista.<br />
<br />
* nastro isolante<br />
* nastro di carta<br />
* nastro biadesivo<br />
* fascette di plastica<br />
* carta vetro di varie gradazioni<br />
* stagno per saldature<br />
* elettrodi per saldatura ad arco<br />
* acetone<br />
* lacca splend'Or<br />
* colla rapida per legno<br />
* stick colla a caldo<br />
* colla cianoacrilato (superattack)<br />
* colla vinilica<br />
<br />
==== Wishlist ====<br />
Quelli riportati di seguito sono strumenti che riteniamo utili ma che non siamo ancora riusciti a procuraci o a costruirci.<br />
<br />
Se qualcuno ne avesse un esemplare inutilizzato anche da riparare, noi siamo pronti a dargli nuova vita.<br />
<br />
* Morsa a croce<br />
* Pistola sverniciatrice<br />
* Dremel<br />
* Sega da banco<br />
* Sega a traforo oscillante<br />
* Serie di chiavi combinate ( o a stella o a forchetta separate )<br />
* Qualsiasi altra apparecchiatura di cui non siamo già forniti<br />
<br />
== [[Privato]] ==<br />
<br />
== [[Progetto FabLab]] ==</div>SuperStehttps://fablabgenova.it/index.php?title=Annuncio_sgombero&diff=825Annuncio sgombero2014-06-17T06:49:06Z<p>SuperSte: Created page with "'''Il 4 Giugno 2014 con un atto violento è stato posto termine ad uno tra i più ampi, longevi e proficui progetti di autogestione mai tentato in questa città.''' Ci scusiam..."</p>
<hr />
<div>'''Il 4 Giugno 2014 con un atto violento è stato posto termine ad uno tra i più ampi, longevi e proficui progetti di autogestione mai tentato in questa città.'''<br />
Ci scusiamo con chi, oggi o nei prossimi giorni, avrebbe voluto usufruire del nostro lavoro e dei nostri spazi perchè non ci troverà lì a portare avanti il laboratorio come abbiamo fatto negli ultimi due anni.<br />
Abbiamo portato via parte dei macchinari e degli utensili e con il resto del Laboratorio Buridda stiamo valutando il percorso migliore per tornare ad offrire alla città quello che le è stato sottratto.<br />
Nel frattempo '''abbiamo bisogno di tutta la vostra solidarietà''', della solidarietà di tutti quelli che pensano che Genova meriti ancora e più di prima un posto come il Buridda e come il fabLab, abbiamo bisogno della vostra solidarietà concreta in ogni forma: partecipate alle nostre iniziative, parlate con le persone e spiegategli cosa hanno perso, parlate con le persone e spiegategli cos'altro potranno perdere se faranno ancora finta di niente.<br />
Intanto vi diamo appuntamento a presto con la fresa che gira, le stampanti 3D in funzione e ancora più potenzialità per i vostri progetti.</div>SuperStehttps://fablabgenova.it/index.php?title=Main_Page&diff=824Main Page2014-06-17T06:41:50Z<p>SuperSte: </p>
<hr />
<div>[[File:sgombero.jpg|380px|right|thumb|Dettaglio del portone della sede di L.S.O.A. Buridda la mattina dello sgombero.]]<br />
<br />
==Annuncio importante:==<br />
<br />
Sabato 14 Giugno, dopo dieci giorni di manifestazioni ed iniziative, in seguito allo sgombero del 4 Giugno, ha preso vita la '''Street Parade'' della Città di Sotto, un corteo pensato per rivendicare tutti i movimenti di autogestione e dissenso presenti nella città di Genova.<br />
<br />
Questa "parata" si è conclusa con l'occupazione dello stabile dell'ex-magistero in corso Montegrappa 39, che ospiterà i laboratori del Buridda; questa nuova occupazione non è affatto un punto di arrivo ma piuttosto un nuovo inizio: nonostante lo spazio sia ottimo e funzionale per le attività presenti nel vecchio edificio di via Bertani, tutto è da ricostruire partendo da quelle aree che permettono alla Buridda di vivere e senza le quali il FabLab Genova così come lo conosciamo non sarebbe mai potuto nascere. <br />
<br />
La mole di lavoro necessaria per rendere nuovamente agibile l'edificio è enorme e richiederà il contributo di tutti.<br />
<br />
'''Fintanto che questi primi lavori non saranno conclusi non sentiamo di poter riprendere l'attività del FabLab''' in senso stretto, ma invitiamo chiunque creda nel nostro progetto a partecipare alle assemblee collettive che si terranno il '''lunedì sera''' e ad aiutare nei lavori di riorganizzazione.<br />
<br />
'''La nostra speranza è quella di poter rendere nuovamente disponibile il servizio che abbiamo dato alla città nel più breve tempo possibile.'''<br />
<br />
Per sapere di più o offrirci il tuo aiuto, '''contattaci a [mailto:info@fablabgenova.it info@fablabgenova.it]'''<br />
<br />
[[http://youtu.be/aX7biR45jfQ video del fablab dopo lo sgombero]]<br />
<br />
----<br />
----<br />
<br />
{{#ev:youtube|p75GlubbOGg|300|right|Video Promo per il nostro primo compleanno}}<br />
<br />
== Come partecipare ==<br />
Il laboratorio e' aperto '''gratuitamente''' al pubblico e mette a disposizione di chiunque le competenze di diverse persone esperte in diversi ambiti (meccanica, informatica, fisica, chimica, elettronica). Il solo "obbligo" per gli utenti e' di condividere le proprie esperienze e le propire capacita' con gli altri utenti. Grazie a questa interazione chiunque puo' realizzare fisicamente le proprie idee anche senza avere le competenze necessarie, visto che le competenze sono distribuite tra gli utenti. Durante l'orario di apertura c'e' sempre in laboratorio qualcuno disponibile ad aiutare nella realizzazione di qualsiasi progetto e a mostrare come utilizzare correttamente e in sicurezza i diversi macchinari (stampanti 3D, fresa CNC, tornio, saldatrice, trapano a colonna, sega circolare, etc...).<br />
<br />
=== Orari di apertura ===<br />
<br />
'''A seguito dello sgombero del LSOA Buridda il laboratorio del FabLab Genova non è più accessibile a nessuno fino a data da destinarsi. Abbiamo salvato alcune macchine, riapriremo presto, contateci!'''<br />
<br />
Una volta riaperto, saremo aperti al pubblico tutti i '''Martedi'''' e '''Giovedi'''' sera a partire dalle '''20.00''' e '''Domenica''' pomeriggio a partire dalle '''16.00'''<br />
<br />
Negli altri giorni e orari e' consigliato concordare via mail [mailto:info@fablabgenova.it info@fablabgenova.it]<br />
<br />
=== Dove siamo ===<br />
Il laboratorio è ospitato all'interno del LSOA Buridda <strike>in '''via Bertani 1''' a Genova. [https://www.google.com/maps?t=m&ll=44.4122321,8.9369363&q=Via+Agostino+Bertani mappa]</strike><br />
<br />
Attualmente non abbiamo più una sede vera e propria, ma presto torneremo ad averla. Stay tuned!<br />
<br />
== [[Progetti]] ==<br />
<br />
Il '''FabLab''' è prima di tutto un laboratorio grazie al quale è possibile realizzare i propri progetti. Il nostro obiettivo è mettere a disposizione metodi di '''prototipazione rapida''' che rendano veloce e possibile il processo di realizzazione di nuove tecnologie da parte di amatori e aziende.<br />
Per fare ciò lavoriamo costantemente alla produzione di macchinari, attrezzature e software totalmente open-source che potete trovare alla pagina "[[Progetti]]", sempre aggiornata per i Makers che ci seguono.<br />
<br />
== Attrezzatura ==<br />
==== Strumenti a disposizione ====<br />
Di seguito la lista degli spazi e degli strumenti disponibili per tutti gli utenti, questi sono suddivisi all'interno di tre stanze: una officina, una stanza dedicata all'elettronica e alla creazione di circuiti stampati ed una terza (l'ingresso) dove vengono effettutati workshop e attività di brainstorming.<br />
Per gli strumenti che richiedono maggiori conoscenze di base e/o specifici accorgimenti è disponibile una pagina "WorkFlow". Un '''WorkFlow''' è una spiegazione dettagliata della procedura necessaria al corretto utilizzo di una determinata attrezzatura.<br />
Se vuoi utilizzare uno dei nostri macchinari per la prima volta ti consigliamo caldamente di leggere la pagina ad esso collegata. <br />
<br />
<br />
'''Prototipazione Rapida''' [[File:Postazione3Dprinter.jpg|400px|thumb|right|Postazione stampa 3D]]<br />
* Makerbot Cupcake 3D printer<br />
* RepRap Mendel Prusa 3D printer<br />
* mini fresa CNC Roland iModela IM-01<br />
* [[Fresa CNC]] a tre assi -> [[WorkFlow Fresa CNC]]<br />
* Tutto il necessario all'incisione di PCB single-layer<br />
<br />
<br />
'''Software di modellazione 3D'''<br />
* SketchUp<br />
* Blender<br />
* ProE<br />
* Autocad<br />
* OpensCad<br />
* FreeCad<br />
* Rhino3D<br />
* [[MeshLab]]<br />
<br />
<br />
'''Elettronica''' [[File:postazione_elettronica.JPG|400px|thumb|right|Postazione elettronica]]<br />
* Alimentatore stabilizzato Delta E030-10 <small>[http://83.117.57.34/nvhr/Delta_E030-10.pdf datasheet]</small><br />
* Saldatori a stilo <br />
* Saldatori a gas<br />
* Oscilloscopio<br />
* Generatore di segnali<br />
* Analizzatore di spettro<br />
<br />
<br />
'''Lavorazione metalli''' [[File:Postazione metalli.JPG|400px|thumb|right|Postazione metalli]]<br />
* Trapano a colonna<br />
* Saldatrice inverter ad arco<br />
* [[Puntatrice]]<br />
* Morsa dritta in acciaio<br />
* Tornio DM Edison<br />
* Mola circolare<br />
* Flessibile Ø 115<br />
* Flessibile Ø 230<br />
* [[Fornace fusione metalli]]<br />
<br />
<br />
'''Lavorazione legno''' [[File:postazioneLegno.jpg|400px|thumb|right|Postazione legno]]<br />
* Sega circolare<br />
* Sega a nastro Black & Deker DN330<br />
* Seghetto alternativo<br />
* Sega a banco<br />
* Seghe manuali dritte e ad arco<br />
* Pialla elettrica<br />
* Pialla manuale<br />
<br />
<br />
'''Produzione PCB'''<br />
* Stampante laser A4 b/n<br />
* Laminatrice a caldo<br />
* mini fresa CNC Roland iModela IM-01<br />
* bancone di incisione per ossidazione acida<br />
<br />
'''Compressore'''<br />
<br />
==== Consumabili ====<br />
Quella di seguito è la lista di consumabili che facciamo in modo che non manchino mai in lab.<br />
<br />
Molto spesso chi li usa lascia poi un contributo per il riapprovigionamento, altrimenti risolviamo (come per tutto il resto) con l'autotassazione.<br />
<br />
Se quindi volete farci un regalo poco impegnativo, ma ben accetto, sceglietelo pure da questa lista.<br />
<br />
* nastro isolante<br />
* nastro di carta<br />
* nastro biadesivo<br />
* fascette di plastica<br />
* carta vetro di varie gradazioni<br />
* stagno per saldature<br />
* elettrodi per saldatura ad arco<br />
* acetone<br />
* lacca splend'Or<br />
* colla rapida per legno<br />
* stick colla a caldo<br />
* colla cianoacrilato (superattack)<br />
* colla vinilica<br />
<br />
==== Wishlist ====<br />
Quelli riportati di seguito sono strumenti che riteniamo utili ma che non siamo ancora riusciti a procuraci o a costruirci.<br />
<br />
Se qualcuno ne avesse un esemplare inutilizzato anche da riparare, noi siamo pronti a dargli nuova vita.<br />
<br />
* Morsa a croce<br />
* Pistola sverniciatrice<br />
* Dremel<br />
* Sega da banco<br />
* Sega a traforo oscillante<br />
* Serie di chiavi combinate ( o a stella o a forchetta separate )<br />
* Qualsiasi altra apparecchiatura di cui non siamo già forniti<br />
<br />
== [[Privato]] ==<br />
<br />
== [[Progetto FabLab]] ==</div>SuperStehttps://fablabgenova.it/index.php?title=Skateboard_%26_Longboard&diff=820Skateboard & Longboard2014-06-15T10:46:36Z<p>SuperSte: Created page with "--- This section is work in Progress and a detailed assembly procedure will be posted here for the Maker Faire in Rome"</p>
<hr />
<div>--- This section is work in Progress and a detailed assembly procedure will be posted here for the Maker Faire in Rome</div>SuperStehttps://fablabgenova.it/index.php?title=Progetti&diff=819Progetti2014-06-15T10:45:36Z<p>SuperSte: /* Work in progress */</p>
<hr />
<div>Questa sezione presenta i progetti ufficiali del laboratorio '''FabLab Genova''', divisi per stato di realizzazione. Tutti i progetti sono opensource e chiunque e' invitato a parteciparvi e a contribuire in qualsiasi modo.<br />
<br />
==== Done ====<br />
<br />
* [[Drawbot]] il robot disegnatore<br />
* [[Through-hole A3982 Stepper Driver]] Driver per motori stepper con chip A3982 - 2A max<br />
* [[Fornace fusione metalli]]<br />
* [[Bruciatore a nebulizzazione]] Il bruciatore della [[Fornace fusione metalli]]<br />
* [[Biodiesel]] Combustibile per [[Fornace fusione metalli]] ottenuto a partire da olio esausto.<br />
* [[Fresa CNC]] a tre assi per la lavorazione di legno e plastica<br />
* [[Cupcake 3D printer upgrade]]<br />
* [[Demoboard per PIC16F1459]]<br />
* [[PIC16F1459 SMT µClock]]<br />
* [[Tutorial ST Nucleo F030R8]]<br />
<br />
==== Work in progress ====<br />
<br />
* [[A caccia dell'elettrone]], un percorso didattico attorno all'elettromagnetismo ( progetto proposto per l'edizione 2014 del [http://www.festivalscienza.it/site/home.html Festival della Scienza] )<br />
* [[Appena colto... in salotto]], realizza il tuo orto verticale hi-tech! ( progetto proposto per l'edizione 2014 del [http://www.festivalscienza.it/site/home.html Festival della Scienza] )<br />
* [[Longboard with a seaview]], realizza il tuo longboard! (vieni in FabLab col tuo compensato ed esci con in fantastico ride!)<br />
* [[SproutBox]] germinatore di sementi<br />
* Procedimento di [[fusione a cera persa]]<br />
* [[Fototrappola]]<br />
* [[RepRap Mendel Prusa]] stampante 3D<br />
* [[StroboDrop]] <br />
* [[Estrusore per riciclo di scarti di ABS]]<br />
* [[TeslaCoil]]<br />
* [[Persistence of Vision Display]]<br />
* [[Generatore elettrico a pedali]]<br />
* [[Drawbot 3]]<br />
* [[Laser cutter]]<br />
<br />
==== To be started ====<br />
<br />
* Laser Engraver - un incisore laser di piccola potenza a controllo numerico<br />
* Macchina per la rifinitura delle stampe in ABS con vapori di acetone<br />
* Electric longboard<br />
* [[Rain sensor]]</div>SuperStehttps://fablabgenova.it/index.php?title=Main_Page&diff=803Main Page2014-06-05T13:50:35Z<p>SuperSte: /* Orari di apertura */</p>
<hr />
<div>==Annuncio importante:==<br />
<br />
'''Ieri con un atto violento è stato posto termine ad uno tra i più ampi, longevi e proficui progetti di autogestione mai tentato in questa città.'''<br />
Ci scusiamo con chi, oggi o nei prossimi giorni, avrebbe voluto usufruire del nostro lavoro e dei nostri spazi perchè non ci troverà lì a portare avanti il laboratorio come abbiamo fatto negli ultimi due anni.<br />
Abbiamo portato via parte dei macchinari e degli utensili e con il resto del Laboratorio Buridda stiamo valutando il percorso migliore per tornare ad offrire alla città quello che le è stato sottratto.<br />
Nel frattempo '''abbiamo bisogno di tutta la vostra solidarietà''', della solidarietà di tutti quelli che pensano che Genova meriti ancora e più di prima un posto come il Buridda e come il fablab, abbiamo bisogno della vostra solidarietà concreta in ogni forma: partecipate alle nostre iniziative, parlate con le persone e spiegategli cosa hanno perso, parlate con le persone e spiegategli cos'altro potranno perdere se faranno ancora finta di niente.<br />
Intanto vi diamo appuntamento a presto con la fresa che gira, le stampanti 3D in funzione e ancora più potenzialità per i vostri progetti.<br />
<br />
Per sapere di più o offrirci il tuo aiuto, '''contattaci a [mailto:info@fablabgenova.it info@fablabgenova.it]'''<br />
<br />
----<br />
----<br />
<br />
{{#ev:youtube|p75GlubbOGg|300|right|Video Promo per il nostro primo compleanno}}<br />
<br />
== Come partecipare ==<br />
Il laboratorio e' aperto '''gratuitamente''' al pubblico e mette a disposizione di chiunque le competenze di diverse persone esperte in diversi ambiti (meccanica, informatica, fisica, chimica, elettronica). Il solo "obbligo" per gli utenti e' di condividere le proprie esperienze e le propire capacita' con gli altri utenti. Grazie a questa interazione chiunque puo' realizzare fisicamente le proprie idee anche senza avere le competenze necessarie, visto che le competenze sono distribuite tra gli utenti. Durante l'orario di apertura c'e' sempre in laboratorio qualcuno disponibile ad aiutare nella realizzazione di qualsiasi progetto e a mostrare come utilizzare correttamente e in sicurezza i diversi macchinari (stampanti 3D, fresa CNC, tornio, saldatrice, trapano a colonna, sega circolare, etc...).<br />
<br />
=== Orari di apertura ===<br />
<br />
'''A seguito dello sgombero del LSOA Buridda il laboratorio del FabLab Genova non è più accessibile a nessuno fino a data da destinarsi. Abbiamo salvato alcune macchine, riapriremo presto, contateci!'''<br />
<br />
Una volta riaperto, saremo aperti al pubblico tutti i '''Martedi'''' e '''Giovedi'''' sera a partire dalle '''20.00''' e '''Domenica''' pomeriggio a partire dalle '''16.00'''<br />
<br />
Negli altri giorni e orari e' consigliato concordare via mail [mailto:info@fablabgenova.it info@fablabgenova.it]<br />
<br />
=== Dove siamo ===<br />
Il laboratorio è ospitato all'interno del LSOA Buridda in '''via Bertani 1''' a Genova. [https://www.google.com/maps?t=m&ll=44.4122321,8.9369363&q=Via+Agostino+Bertani mappa]<br />
<br />
== [[Progetti]] ==<br />
<br />
Il '''FabLab''' è prima di tutto un laboratorio grazie al quale è possibile realizzare i propri progetti. Il nostro obiettivo è mettere a disposizione metodi di '''prototipazione rapida''' che rendano veloce e possibile il processo di realizzazione di nuove tecnologie da parte di amatori e aziende.<br />
Per fare ciò lavoriamo costantemente alla produzione di macchinari, attrezzature e software totalmente open-source che potete trovare alla pagina "[[Progetti]]", sempre aggiornata per i Makers che ci seguono.<br />
<br />
== Attrezzatura ==<br />
==== Strumenti a disposizione ====<br />
Di seguito la lista degli spazi e degli strumenti disponibili per tutti gli utenti, questi sono suddivisi all'interno di tre stanze: una officina, una stanza dedicata all'elettronica e alla creazione di circuiti stampati ed una terza (l'ingresso) dove vengono effettutati workshop e attività di brainstorming.<br />
Per gli strumenti che richiedono maggiori conoscenze di base e/o specifici accorgimenti è disponibile una pagina "WorkFlow". Un '''WorkFlow''' è una spiegazione dettagliata della procedura necessaria al corretto utilizzo di una determinata attrezzatura.<br />
Se vuoi utilizzare uno dei nostri macchinari per la prima volta ti consigliamo caldamente di leggere la pagina ad esso collegata. <br />
<br />
<br />
'''Prototipazione Rapida''' [[File:Postazione3Dprinter.jpg|400px|thumb|right|Postazione stampa 3D]]<br />
* Makerbot Cupcake 3D printer<br />
* RepRap Mendel Prusa 3D printer<br />
* mini fresa CNC Roland iModela IM-01<br />
* [[Fresa CNC]] a tre assi -> [[WorkFlow Fresa CNC]]<br />
* Tutto il necessario all'incisione di PCB single-layer<br />
<br />
<br />
'''Software di modellazione 3D'''<br />
* SketchUp<br />
* Blender<br />
* ProE<br />
* Autocad<br />
* OpensCad<br />
* FreeCad<br />
* Rhino3D<br />
* [[MeshLab]]<br />
<br />
<br />
'''Elettronica''' [[File:postazione_elettronica.JPG|400px|thumb|right|Postazione elettronica]]<br />
* Alimentatore stabilizzato Delta E030-10 <small>[http://83.117.57.34/nvhr/Delta_E030-10.pdf datasheet]</small><br />
* Saldatori a stilo <br />
* Saldatori a gas<br />
* Oscilloscopio<br />
* Generatore di segnali<br />
* Analizzatore di spettro<br />
<br />
<br />
'''Lavorazione metalli''' [[File:Postazione metalli.JPG|400px|thumb|right|Postazione metalli]]<br />
* Trapano a colonna<br />
* Saldatrice inverter ad arco<br />
* [[Puntatrice]]<br />
* Morsa dritta in acciaio<br />
* Tornio DM Edison<br />
* Mola circolare<br />
* Flessibile Ø 115<br />
* Flessibile Ø 230<br />
* [[Fornace fusione metalli]]<br />
<br />
<br />
'''Lavorazione legno''' [[File:postazioneLegno.jpg|400px|thumb|right|Postazione legno]]<br />
* Sega circolare<br />
* Sega a nastro Black & Deker DN330<br />
* Seghetto alternativo<br />
* Sega a banco<br />
* Seghe manuali dritte e ad arco<br />
* Pialla elettrica<br />
* Pialla manuale<br />
<br />
<br />
'''Produzione PCB'''<br />
* Stampante laser A4 b/n<br />
* Laminatrice a caldo<br />
* mini fresa CNC Roland iModela IM-01<br />
* bancone di incisione per ossidazione acida<br />
<br />
'''Compressore'''<br />
<br />
==== Consumabili ====<br />
Quella di seguito è la lista di consumabili che facciamo in modo che non manchino mai in lab.<br />
<br />
Molto spesso chi li usa lascia poi un contributo per il riapprovigionamento, altrimenti risolviamo (come per tutto il resto) con l'autotassazione.<br />
<br />
Se quindi volete farci un regalo poco impegnativo, ma ben accetto, sceglietelo pure da questa lista.<br />
<br />
* nastro isolante<br />
* nastro di carta<br />
* nastro biadesivo<br />
* fascette di plastica<br />
* carta vetro di varie gradazioni<br />
* stagno per saldature<br />
* elettrodi per saldatura ad arco<br />
* acetone<br />
* lacca splend'Or<br />
* colla rapida per legno<br />
* stick colla a caldo<br />
* colla cianoacrilato (superattack)<br />
* colla vinilica<br />
<br />
==== Wishlist ====<br />
Quelli riportati di seguito sono strumenti che riteniamo utili ma che non siamo ancora riusciti a procuraci o a costruirci.<br />
<br />
Se qualcuno ne avesse un esemplare inutilizzato anche da riparare, noi siamo pronti a dargli nuova vita.<br />
<br />
* Morsa a croce<br />
* Pistola sverniciatrice<br />
* Dremel<br />
* Sega da banco<br />
* Sega a traforo oscillante<br />
* Serie di chiavi combinate ( o a stella o a forchetta separate )<br />
* Qualsiasi altra apparecchiatura di cui non siamo già forniti<br />
<br />
== [[Privato]] ==<br />
<br />
== [[Progetto FabLab]] ==</div>SuperStehttps://fablabgenova.it/index.php?title=Main_Page&diff=802Main Page2014-06-05T13:47:04Z<p>SuperSte: /* Annuncio importante: */</p>
<hr />
<div>==Annuncio importante:==<br />
<br />
'''Ieri con un atto violento è stato posto termine ad uno tra i più ampi, longevi e proficui progetti di autogestione mai tentato in questa città.'''<br />
Ci scusiamo con chi, oggi o nei prossimi giorni, avrebbe voluto usufruire del nostro lavoro e dei nostri spazi perchè non ci troverà lì a portare avanti il laboratorio come abbiamo fatto negli ultimi due anni.<br />
Abbiamo portato via parte dei macchinari e degli utensili e con il resto del Laboratorio Buridda stiamo valutando il percorso migliore per tornare ad offrire alla città quello che le è stato sottratto.<br />
Nel frattempo '''abbiamo bisogno di tutta la vostra solidarietà''', della solidarietà di tutti quelli che pensano che Genova meriti ancora e più di prima un posto come il Buridda e come il fablab, abbiamo bisogno della vostra solidarietà concreta in ogni forma: partecipate alle nostre iniziative, parlate con le persone e spiegategli cosa hanno perso, parlate con le persone e spiegategli cos'altro potranno perdere se faranno ancora finta di niente.<br />
Intanto vi diamo appuntamento a presto con la fresa che gira, le stampanti 3D in funzione e ancora più potenzialità per i vostri progetti.<br />
<br />
Per sapere di più o offrirci il tuo aiuto, '''contattaci a [mailto:info@fablabgenova.it info@fablabgenova.it]'''<br />
<br />
----<br />
----<br />
<br />
{{#ev:youtube|p75GlubbOGg|300|right|Video Promo per il nostro primo compleanno}}<br />
<br />
== Come partecipare ==<br />
Il laboratorio e' aperto '''gratuitamente''' al pubblico e mette a disposizione di chiunque le competenze di diverse persone esperte in diversi ambiti (meccanica, informatica, fisica, chimica, elettronica). Il solo "obbligo" per gli utenti e' di condividere le proprie esperienze e le propire capacita' con gli altri utenti. Grazie a questa interazione chiunque puo' realizzare fisicamente le proprie idee anche senza avere le competenze necessarie, visto che le competenze sono distribuite tra gli utenti. Durante l'orario di apertura c'e' sempre in laboratorio qualcuno disponibile ad aiutare nella realizzazione di qualsiasi progetto e a mostrare come utilizzare correttamente e in sicurezza i diversi macchinari (stampanti 3D, fresa CNC, tornio, saldatrice, trapano a colonna, sega circolare, etc...).<br />
<br />
=== Orari di apertura ===<br />
<br />
'''A seguito dello sgombero del LSOA Buridda il laboratorio del FabLab Genova non è più accessibile a nessuno fino a data da destinarsi. Abbiamo salvato alcune macchine, riapriremo presto, contateci!'''<br />
<br />
Una volta riaperto, saremo aperti al pubblico tutti i '''Martedi'''' e '''Giovedi'''' sera a partire dalle '''20.00''' e '''Domenica''' pomeriggio a partire dalle '''16.00'''<br />
<br />
Negli altri giorni e orari e' consigliato concordare via mail a info@fablabgenova.it<br />
<br />
=== Dove siamo ===<br />
Il laboratorio è ospitato all'interno del LSOA Buridda in '''via Bertani 1''' a Genova. [https://www.google.com/maps?t=m&ll=44.4122321,8.9369363&q=Via+Agostino+Bertani mappa]<br />
<br />
== [[Progetti]] ==<br />
<br />
Il '''FabLab''' è prima di tutto un laboratorio grazie al quale è possibile realizzare i propri progetti. Il nostro obiettivo è mettere a disposizione metodi di '''prototipazione rapida''' che rendano veloce e possibile il processo di realizzazione di nuove tecnologie da parte di amatori e aziende.<br />
Per fare ciò lavoriamo costantemente alla produzione di macchinari, attrezzature e software totalmente open-source che potete trovare alla pagina "[[Progetti]]", sempre aggiornata per i Makers che ci seguono.<br />
<br />
== Attrezzatura ==<br />
==== Strumenti a disposizione ====<br />
Di seguito la lista degli spazi e degli strumenti disponibili per tutti gli utenti, questi sono suddivisi all'interno di tre stanze: una officina, una stanza dedicata all'elettronica e alla creazione di circuiti stampati ed una terza (l'ingresso) dove vengono effettutati workshop e attività di brainstorming.<br />
Per gli strumenti che richiedono maggiori conoscenze di base e/o specifici accorgimenti è disponibile una pagina "WorkFlow". Un '''WorkFlow''' è una spiegazione dettagliata della procedura necessaria al corretto utilizzo di una determinata attrezzatura.<br />
Se vuoi utilizzare uno dei nostri macchinari per la prima volta ti consigliamo caldamente di leggere la pagina ad esso collegata. <br />
<br />
<br />
'''Prototipazione Rapida''' [[File:Postazione3Dprinter.jpg|400px|thumb|right|Postazione stampa 3D]]<br />
* Makerbot Cupcake 3D printer<br />
* RepRap Mendel Prusa 3D printer<br />
* mini fresa CNC Roland iModela IM-01<br />
* [[Fresa CNC]] a tre assi -> [[WorkFlow Fresa CNC]]<br />
* Tutto il necessario all'incisione di PCB single-layer<br />
<br />
<br />
'''Software di modellazione 3D'''<br />
* SketchUp<br />
* Blender<br />
* ProE<br />
* Autocad<br />
* OpensCad<br />
* FreeCad<br />
* Rhino3D<br />
* [[MeshLab]]<br />
<br />
<br />
'''Elettronica''' [[File:postazione_elettronica.JPG|400px|thumb|right|Postazione elettronica]]<br />
* Alimentatore stabilizzato Delta E030-10 <small>[http://83.117.57.34/nvhr/Delta_E030-10.pdf datasheet]</small><br />
* Saldatori a stilo <br />
* Saldatori a gas<br />
* Oscilloscopio<br />
* Generatore di segnali<br />
* Analizzatore di spettro<br />
<br />
<br />
'''Lavorazione metalli''' [[File:Postazione metalli.JPG|400px|thumb|right|Postazione metalli]]<br />
* Trapano a colonna<br />
* Saldatrice inverter ad arco<br />
* [[Puntatrice]]<br />
* Morsa dritta in acciaio<br />
* Tornio DM Edison<br />
* Mola circolare<br />
* Flessibile Ø 115<br />
* Flessibile Ø 230<br />
* [[Fornace fusione metalli]]<br />
<br />
<br />
'''Lavorazione legno''' [[File:postazioneLegno.jpg|400px|thumb|right|Postazione legno]]<br />
* Sega circolare<br />
* Sega a nastro Black & Deker DN330<br />
* Seghetto alternativo<br />
* Sega a banco<br />
* Seghe manuali dritte e ad arco<br />
* Pialla elettrica<br />
* Pialla manuale<br />
<br />
<br />
'''Produzione PCB'''<br />
* Stampante laser A4 b/n<br />
* Laminatrice a caldo<br />
* mini fresa CNC Roland iModela IM-01<br />
* bancone di incisione per ossidazione acida<br />
<br />
'''Compressore'''<br />
<br />
==== Consumabili ====<br />
Quella di seguito è la lista di consumabili che facciamo in modo che non manchino mai in lab.<br />
<br />
Molto spesso chi li usa lascia poi un contributo per il riapprovigionamento, altrimenti risolviamo (come per tutto il resto) con l'autotassazione.<br />
<br />
Se quindi volete farci un regalo poco impegnativo, ma ben accetto, sceglietelo pure da questa lista.<br />
<br />
* nastro isolante<br />
* nastro di carta<br />
* nastro biadesivo<br />
* fascette di plastica<br />
* carta vetro di varie gradazioni<br />
* stagno per saldature<br />
* elettrodi per saldatura ad arco<br />
* acetone<br />
* lacca splend'Or<br />
* colla rapida per legno<br />
* stick colla a caldo<br />
* colla cianoacrilato (superattack)<br />
* colla vinilica<br />
<br />
==== Wishlist ====<br />
Quelli riportati di seguito sono strumenti che riteniamo utili ma che non siamo ancora riusciti a procuraci o a costruirci.<br />
<br />
Se qualcuno ne avesse un esemplare inutilizzato anche da riparare, noi siamo pronti a dargli nuova vita.<br />
<br />
* Morsa a croce<br />
* Pistola sverniciatrice<br />
* Dremel<br />
* Sega da banco<br />
* Sega a traforo oscillante<br />
* Serie di chiavi combinate ( o a stella o a forchetta separate )<br />
* Qualsiasi altra apparecchiatura di cui non siamo già forniti<br />
<br />
== [[Privato]] ==<br />
<br />
== [[Progetto FabLab]] ==</div>SuperStehttps://fablabgenova.it/index.php?title=Privato&diff=113Privato2013-02-18T11:33:14Z<p>SuperSte: /* Riunioni plenarie */</p>
<hr />
<div>{{#allow-groups:administrators|fablabber}}<br />
<br />
== Links ai documenti ==<br />
* [https://docs.google.com/spreadsheet/ccc?key=0AiDa1XrPg6gGdHZPR1QtS3V3SlYxWm5NSW9FNkJwYkE&usp=sharing Inventario]<br />
* [https://docs.google.com/spreadsheet/ccc?key=0As6O_oAo4lOodHVPS3NSRHFZdnV1N0xQUzk1RktFdVE Foglio spese]<br />
* [https://docs.google.com/spreadsheet/ccc?key=0AiDa1XrPg6gGdDI3OWhON3NTYXZHTGppZnFWZGZUdVE Lista macchinari]<br />
<br />
== Attività da fare==<br />
* Impianto elettrico: test e redistribuzione carichi<br />
* Rete: stesura, crimpaggio e test dei nuovi cavi<br />
* verniciatura della porta<br />
* <del>Svuotare il bancone nella stanza della linea, allestire zona lavorazione legno e zona lavorazione ferro</del><br />
* <del>Sito: cambiare logo</del><br />
<br />
== Riunioni plenarie ==<br />
<br />
==== 19/02/13 ====<br />
ODG (aggiungete qui i punti che volete portare all'ordine del giorno)<br />
* acquisto estrusore stampante<br />
** https://grrf.de/en/catalog/hot-end<br />
** http://www.makergear.com/products/operators-pack<br />
* Gestione soldi per progetti/FabLab<br />
* Dimmer nel futuro (come commercializzarlo per il Buridda)<br />
<br />
==== 10/02/13 ====<br />
* Il giorno di apertura al pubblico è Martedì sera<br />
* decise le attività da fare<br />
* decisa la modalità di acquisto attrezzature<br />
** utilizziamo una wishlist<br />
** valutiamo insieme se l'attrezzatura deve essere acquistata da tutti e in base alla valutazione<br />
*** ci autotassiamo e acquistiamo in nome del fablab (l'oggetto rimane fablab)<br />
*** qualcuno decide di comprarlo in autonomia, ne è l'unico proprietario e può decidere di prestarlo al fablab.<br />
*** ci autotassiamo e il fablab adotta l'oggetto diventandone proprietario<br />
* scelto il logo ufficiale: logo fablab con le piovre al posto degli omini. Versioni a colore e bw<br />
* sito: utilizziamo la wiki per gestire il fablab e utilizziamo wordpress per il solo blog pubblico<br />
* inaugurazione: data da decidere, ma comunque successiva all'apertura al pubblico (già iniziata)<br />
* fablab o hackerspace? aderire o no alla comunità dei fablab? Vedremo, ci aggiorniamo</div>SuperStehttps://fablabgenova.it/index.php?title=Privato&diff=112Privato2013-02-18T11:32:30Z<p>SuperSte: /* 19/02/13 */</p>
<hr />
<div>{{#allow-groups:administrators|fablabber}}<br />
<br />
== Links ai documenti ==<br />
* [https://docs.google.com/spreadsheet/ccc?key=0AiDa1XrPg6gGdHZPR1QtS3V3SlYxWm5NSW9FNkJwYkE&usp=sharing Inventario]<br />
* [https://docs.google.com/spreadsheet/ccc?key=0As6O_oAo4lOodHVPS3NSRHFZdnV1N0xQUzk1RktFdVE Foglio spese]<br />
* [https://docs.google.com/spreadsheet/ccc?key=0AiDa1XrPg6gGdDI3OWhON3NTYXZHTGppZnFWZGZUdVE Lista macchinari]<br />
<br />
== Attività da fare==<br />
* Impianto elettrico: test e redistribuzione carichi<br />
* Rete: stesura, crimpaggio e test dei nuovi cavi<br />
* verniciatura della porta<br />
* <del>Svuotare il bancone nella stanza della linea, allestire zona lavorazione legno e zona lavorazione ferro</del><br />
* <del>Sito: cambiare logo</del><br />
<br />
== Riunioni plenarie ==<br />
<br />
==== 10/02/13 ====<br />
* Il giorno di apertura al pubblico è Martedì sera<br />
* decise le attività da fare<br />
* decisa la modalità di acquisto attrezzature<br />
** utilizziamo una wishlist<br />
** valutiamo insieme se l'attrezzatura deve essere acquistata da tutti e in base alla valutazione<br />
*** ci autotassiamo e acquistiamo in nome del fablab (l'oggetto rimane fablab)<br />
*** qualcuno decide di comprarlo in autonomia, ne è l'unico proprietario e può decidere di prestarlo al fablab.<br />
*** ci autotassiamo e il fablab adotta l'oggetto diventandone proprietario<br />
* scelto il logo ufficiale: logo fablab con le piovre al posto degli omini. Versioni a colore e bw<br />
* sito: utilizziamo la wiki per gestire il fablab e utilizziamo wordpress per il solo blog pubblico<br />
* inaugurazione: data da decidere, ma comunque successiva all'apertura al pubblico (già iniziata)<br />
* fablab o hackerspace? aderire o no alla comunità dei fablab? Vedremo, ci aggiorniamo<br />
<br />
==== 19/02/13 ====<br />
ODG (aggiungete qui i punti che volete portare all'ordine del giorno)<br />
* acquisto estrusore stampante<br />
** https://grrf.de/en/catalog/hot-end<br />
** http://www.makergear.com/products/operators-pack<br />
* Gestione soldi per progetti/FabLab<br />
* Dimmer nel futuro (come commercializzarlo per il Buridda)</div>SuperStehttps://fablabgenova.it/index.php?title=Software&diff=64Software2013-02-13T16:00:32Z<p>SuperSte: /* Processing code */</p>
<hr />
<div><br />
== Image pre-processing ==<br />
assuming GIMP:<br />
* Push up the contrast<br />
* Image ==> Mode ==> Indexed<br />
* B/W (1 bit palette)<br />
* Dithering: Floyd-Steinberg<br />
<br />
== Processing code ==<br />
for the conversion from the image file to the pen tip path<br />
<br />
Step by Step:<br />
# Install [http://www.processing.org Processing]<br />
# Download and Install [http://hg.postspectacular.com/toxiclibs/downloads toxiclib]<br />
# Create a sketch with the code below:<br />
<br />
<source lang="javascript"><br />
import toxi.geom.*;<br />
<br />
// tsp variables <br />
int particleRouteLength;<br />
Vec2D[] particles;<br />
int[] particleRoute;<br />
int maxParticles;<br />
<br />
// image variable<br />
PImage img; <br />
<br />
float millisLastFrame = 0;<br />
float frameTime = 0;<br />
// scale of the drawing<br />
float s = 2.0;<br />
<br />
void setup() {<br />
<br />
maxParticles = 15000;<br />
//img = loadImage("lenna-lg_BW_loRes.png");<br />
//img = loadImage("test.png");<br />
img = loadImage("lenna_BW_loRes2.png");<br />
size(img.width*(int)s, img.height*(int)s);<br />
//size(400, 600);<br />
// count black pixels<br />
int i;<br />
maxParticles = 0;<br />
for ( int x = 0; x < img.width; x++ ) {<br />
for ( int y = 0; y < img.height; y++ ) { <br />
i = ( ( y * img.width ) + x ); // getting pixel index<br />
if ( img.pixels[i] == color( 0, 0, 0 ) ) {<br />
maxParticles++;<br />
}<br />
}<br />
}<br />
<br />
println("black dots: " + maxParticles);<br />
// allocate and fill points vector<br />
particles = new Vec2D[maxParticles];<br />
i = 0;<br />
int j = 0;<br />
for ( int x = 0; x < img.width; x++ ) {<br />
for ( int y = 0; y < img.height; y++ ) { <br />
i = ( ( y * img.width ) + x );<br />
if ( img.pixels[i] == color( 0, 0, 0 ) ) {<br />
Vec2D p1 = new Vec2D(x, y);<br />
particles[j] = p1;<br />
j++;<br />
}<br />
}<br />
}<br />
millisLastFrame = millis();<br />
initPath(); // initialize path (NN heuristic)<br />
for (int l = 0; l < 5; l++ ) {<br />
// optimize path with 2-opt heuristic<br />
for (int k = 0; k < 5000; k++ ) optimizePath();<br />
// profiling ...<br />
frameTime = (millis() - millisLastFrame)/1000;<br />
millisLastFrame = millis();<br />
println("Frame time: " + millisLastFrame);<br />
}<br />
noLoop();<br />
}<br />
<br />
void initPath()<br />
{ <br />
int temp;<br />
println("initializing path (NN)");<br />
Vec2D p1, p2;<br />
particleRouteLength = maxParticles;<br />
// array of free ramaining particles to be queried<br />
boolean freeParticles[] = new boolean[maxParticles]; <br />
particleRoute = new int[particleRouteLength]; <br />
int closestParticle;<br />
float distMin;<br />
p1 = particles[0];<br />
freeParticles[0] = true;<br />
particleRoute[0] = 0;<br />
// Nearest neighbor ("Simple, Greedy") algorithm path optimization:<br />
int i = 0, j;<br />
float dx, dy, distance; <br />
while (i < particleRouteLength) {<br />
distMin = Float.MAX_VALUE; // re-initialize mimimun distance value<br />
closestParticle = 0; // re-initialize closest particle<br />
for (j = 0; j < particleRouteLength; j++) {<br />
if (freeParticles[j] == false) {<br />
p2 = particles[j]; // get next particle to calculate distance<br />
dx = p1.x - p2.x;<br />
dy = p1.y - p2.y;<br />
distance = (float) (dx*dx+dy*dy); // Only looking for closest; do not need sqrt factor!<br />
if (distance < distMin) {<br />
closestParticle = j; // update the closest particle index<br />
distMin = distance; // update the minimum distance value<br />
}<br />
}<br />
}<br />
freeParticles[closestParticle] = true; // remove the particle from the ones to be queried<br />
particleRoute[i] = closestParticle; //set the next particle in the path<br />
i++; // increment while counter<br />
}<br />
// Initial routing is complete<br />
frameTime = (millis() - millisLastFrame)/1000;<br />
millisLastFrame = millis();<br />
println("Frame time: " + millisLastFrame);<br />
}<br />
<br />
void optimizePath() {<br />
// 2-opt heuristic optimization:<br />
// Identify a pair of edges that would become shorter by reversing part of the tour.<br />
int temp;<br />
//println("optimizing path (2-opt) " );<br />
for (int i = 0; i < 5000; ++i) { // 1000 tests per frame; you can edit this number.<br />
int indexA = floor(random(particleRouteLength - 1));<br />
int indexB = floor(random(particleRouteLength - 1));<br />
if (Math.abs(indexA - indexB) < 2)<br />
continue;<br />
if (indexB < indexA) { // swap A, B.<br />
temp = indexB;<br />
indexB = indexA;<br />
indexA = temp;<br />
}<br />
<br />
Vec2D a0 = particles[particleRoute[indexA]];<br />
Vec2D a1 = particles[particleRoute[indexA + 1]];<br />
Vec2D b0 = particles[particleRoute[indexB]];<br />
Vec2D b1 = particles[particleRoute[indexB + 1]];<br />
<br />
// Original distance:<br />
float dx = a0.x - a1.x;<br />
float dy = a0.y - a1.y;<br />
float distance = (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
dx = b0.x - b1.x;<br />
dy = b0.y - b1.y;<br />
distance += (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
// Possible shorter distance?<br />
dx = a0.x - b0.x;<br />
dy = a0.y - b0.y;<br />
float distance2 = (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
dx = a1.x - b1.x;<br />
dy = a1.y - b1.y;<br />
distance2 += (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
<br />
if (distance2 < distance) { // Reverse tour between a1 and b0. <br />
int indexhigh = indexB;<br />
int indexlow = indexA + 1;<br />
while (indexhigh > indexlow) {<br />
temp = particleRoute[indexlow];<br />
particleRoute[indexlow] = particleRoute[indexhigh];<br />
particleRoute[indexhigh] = temp;<br />
indexhigh--;<br />
indexlow++;<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
void draw() {<br />
//image(img, 0, 0);<br />
image(img, width*s, height*s);<br />
int i = 0;<br />
stroke(128, 128, 255); // Stroke color (blue)<br />
strokeWeight (.5); // stroke weight<br />
println("in draw, n.part : " + particleRouteLength);<br />
<br />
// loop the particles drawing a line between successive points<br />
for ( i = 0; i < (particleRouteLength - 1); ++i) {<br />
Vec2D p1 = particles[particleRoute[i]];<br />
Vec2D p2 = particles[particleRoute[i + 1]];<br />
line(p1.x*s, p1.y*s, p2.x*s, p2.y*s);<br />
}<br />
}<br />
</source><br />
<br />
----<br />
<br />
== Python code ==<br />
for the low level controller<br />
<br />
<source lang="python"><br />
from time import sleep<br />
from math import pi<br />
import RPi.GPIO as GPIO<br />
<br />
# systems parameters<br />
r_p = 18.0 #............... pulley radius [mm]<br />
d_p = 1500.0 #............. pulley distance [mm]<br />
d_p05 = dp * 0.5 #......... half pulley distance [mm]<br />
s_a = 3.5 * (2*pi/360) #... step angle [rad]<br />
<br />
# drawing parameters<br />
s = 2.0 #.................. drawing scale [-]<br />
<br />
# initialize output pins<br />
GPIO.setup(13, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
<br />
<br />
pos = [240, 240] #.... set initial position vector (x,Y)<br />
len_curr = getStringsLen(pos_init, d_p05, s) # get initial string<br />
<br />
for i in list<br />
pos_next = path[i]<br />
len_next = getStringsLen(pos_next, d_p05, s)<br />
dl = len_next - len_curr<br />
ds = dl/s_a<br />
<br />
<br />
def getStringsLen(pos_xy, halfPullDist, scale)<br />
x2 = (pos_xy[0] * scale)**2<br />
x2b2 = (halfPullDist - pos_xy[0] * scale)**2<br />
y2 = (pos_xy[1] * scale)**2<br />
return [sqrt(x2+y2) , sqrt(x2b2+y2)]<br />
</source></div>SuperStehttps://fablabgenova.it/index.php?title=Software&diff=59Software2013-02-13T13:56:02Z<p>SuperSte: /* python code */</p>
<hr />
<div><br />
== Image pre-processing ==<br />
assuming GIMP:<br />
* Push up the contrast<br />
* Image ==> Mode ==> Indexed<br />
* B/W (1 bit palette)<br />
* Dithering: Floyd-Steinberg<br />
<br />
== Processing code ==<br />
for the conversion from the image file to the pen tip path<br />
<br />
<pre><br />
import toxi.geom.*;<br />
<br />
// tsp variables <br />
int particleRouteLength;<br />
Vec2D[] particles;<br />
int[] particleRoute;<br />
int maxParticles;<br />
<br />
// image variable<br />
PImage img; <br />
<br />
float millisLastFrame = 0;<br />
float frameTime = 0;<br />
// scale of the drawing<br />
float s = 2.0;<br />
<br />
void setup() {<br />
<br />
maxParticles = 15000;<br />
//img = loadImage("lenna-lg_BW_loRes.png");<br />
//img = loadImage("test.png");<br />
img = loadImage("lenna_BW_loRes2.png");<br />
size(img.width*(int)s, img.height*(int)s);<br />
//size(400, 600);<br />
// count black pixels<br />
int i;<br />
maxParticles = 0;<br />
for ( int x = 0; x < img.width; x++ ) {<br />
for ( int y = 0; y < img.height; y++ ) { <br />
i = ( ( y * img.width ) + x ); // getting pixel index<br />
if ( img.pixels[i] == color( 0, 0, 0 ) ) {<br />
maxParticles++;<br />
}<br />
}<br />
}<br />
<br />
println("black dots: " + maxParticles);<br />
// allocate and fill points vector<br />
particles = new Vec2D[maxParticles];<br />
i = 0;<br />
int j = 0;<br />
for ( int x = 0; x < img.width; x++ ) {<br />
for ( int y = 0; y < img.height; y++ ) { <br />
i = ( ( y * img.width ) + x );<br />
if ( img.pixels[i] == color( 0, 0, 0 ) ) {<br />
Vec2D p1 = new Vec2D(x, y);<br />
particles[j] = p1;<br />
j++;<br />
}<br />
}<br />
}<br />
millisLastFrame = millis();<br />
initPath(); // initialize path (NN heuristic)<br />
for (int l = 0; l < 5; l++ ) {<br />
// optimize path with 2-opt heuristic<br />
for (int k = 0; k < 5000; k++ ) optimizePath();<br />
// profiling ...<br />
frameTime = (millis() - millisLastFrame)/1000;<br />
millisLastFrame = millis();<br />
println("Frame time: " + millisLastFrame);<br />
}<br />
noLoop();<br />
}<br />
<br />
void initPath()<br />
{ <br />
int temp;<br />
println("initializing path (NN)");<br />
Vec2D p1, p2;<br />
particleRouteLength = maxParticles;<br />
// array of free ramaining particles to be queried<br />
boolean freeParticles[] = new boolean[maxParticles]; <br />
particleRoute = new int[particleRouteLength]; <br />
int closestParticle;<br />
float distMin;<br />
p1 = particles[0];<br />
freeParticles[0] = true;<br />
particleRoute[0] = 0;<br />
// Nearest neighbor ("Simple, Greedy") algorithm path optimization:<br />
int i = 0, j;<br />
float dx, dy, distance; <br />
while (i < particleRouteLength) {<br />
distMin = Float.MAX_VALUE; // re-initialize mimimun distance value<br />
closestParticle = 0; // re-initialize closest particle<br />
for (j = 0; j < particleRouteLength; j++) {<br />
if (freeParticles[j] == false) {<br />
p2 = particles[j]; // get next particle to calculate distance<br />
dx = p1.x - p2.x;<br />
dy = p1.y - p2.y;<br />
distance = (float) (dx*dx+dy*dy); // Only looking for closest; do not need sqrt factor!<br />
if (distance < distMin) {<br />
closestParticle = j; // update the closest particle index<br />
distMin = distance; // update the minimum distance value<br />
}<br />
}<br />
}<br />
freeParticles[closestParticle] = true; // remove the particle from the ones to be queried<br />
particleRoute[i] = closestParticle; //set the next particle in the path<br />
i++; // increment while counter<br />
}<br />
// Initial routing is complete<br />
frameTime = (millis() - millisLastFrame)/1000;<br />
millisLastFrame = millis();<br />
println("Frame time: " + millisLastFrame);<br />
}<br />
<br />
void optimizePath() {<br />
// 2-opt heuristic optimization:<br />
// Identify a pair of edges that would become shorter by reversing part of the tour.<br />
int temp;<br />
//println("optimizing path (2-opt) " );<br />
for (int i = 0; i < 5000; ++i) { // 1000 tests per frame; you can edit this number.<br />
int indexA = floor(random(particleRouteLength - 1));<br />
int indexB = floor(random(particleRouteLength - 1));<br />
if (Math.abs(indexA - indexB) < 2)<br />
continue;<br />
if (indexB < indexA) { // swap A, B.<br />
temp = indexB;<br />
indexB = indexA;<br />
indexA = temp;<br />
}<br />
<br />
Vec2D a0 = particles[particleRoute[indexA]];<br />
Vec2D a1 = particles[particleRoute[indexA + 1]];<br />
Vec2D b0 = particles[particleRoute[indexB]];<br />
Vec2D b1 = particles[particleRoute[indexB + 1]];<br />
<br />
// Original distance:<br />
float dx = a0.x - a1.x;<br />
float dy = a0.y - a1.y;<br />
float distance = (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
dx = b0.x - b1.x;<br />
dy = b0.y - b1.y;<br />
distance += (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
// Possible shorter distance?<br />
dx = a0.x - b0.x;<br />
dy = a0.y - b0.y;<br />
float distance2 = (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
dx = a1.x - b1.x;<br />
dy = a1.y - b1.y;<br />
distance2 += (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
<br />
if (distance2 < distance) { // Reverse tour between a1 and b0. <br />
int indexhigh = indexB;<br />
int indexlow = indexA + 1;<br />
while (indexhigh > indexlow) {<br />
temp = particleRoute[indexlow];<br />
particleRoute[indexlow] = particleRoute[indexhigh];<br />
particleRoute[indexhigh] = temp;<br />
indexhigh--;<br />
indexlow++;<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
void draw() {<br />
//image(img, 0, 0);<br />
image(img, width*s, height*s);<br />
int i = 0;<br />
stroke(128, 128, 255); // Stroke color (blue)<br />
strokeWeight (.5); // stroke weight<br />
println("in draw, n.part : " + particleRouteLength);<br />
<br />
// loop the particles drawing a line between successive points<br />
for ( i = 0; i < (particleRouteLength - 1); ++i) {<br />
Vec2D p1 = particles[particleRoute[i]];<br />
Vec2D p2 = particles[particleRoute[i + 1]];<br />
line(p1.x*s, p1.y*s, p2.x*s, p2.y*s);<br />
}<br />
}<br />
</pre><br />
<br />
----<br />
<br />
== Python code ==<br />
for the low level controller<br />
<br />
<pre><br />
from time import sleep<br />
from math import pi<br />
import RPi.GPIO as GPIO<br />
<br />
# systems parameters<br />
r_p = 18.0 #............... pulley radius [mm]<br />
d_p = 1500.0 #............. pulley distance [mm]<br />
d_p05 = dp * 0.5 #......... half pulley distance [mm]<br />
s_a = 3.5 * (2*pi/360) #... step angle [rad]<br />
<br />
# drawing parameters<br />
s = 2.0 #.................. drawing scale [-]<br />
<br />
# initialize output pins<br />
GPIO.setup(13, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
<br />
<br />
pos = [240, 240] #.... set initial position vector (x,Y)<br />
len_curr = getStringsLen(pos_init, d_p05, s) # get initial string<br />
<br />
for i in list<br />
pos_next = path[i]<br />
len_next = getStringsLen(pos_next, d_p05, s)<br />
dl = len_next - len_curr<br />
ds = dl/s_a<br />
<br />
<br />
def getStringsLen(pos_xy, halfPullDist, scale)<br />
x2 = (pos_xy[0] * scale)**2<br />
x2b2 = (halfPullDist - pos_xy[0] * scale)**2<br />
y2 = (pos_xy[1] * scale)**2<br />
return [sqrt(x2+y2) , sqrt(x2b2+y2)]<br />
</pre></div>SuperStehttps://fablabgenova.it/index.php?title=Software&diff=58Software2013-02-13T13:55:34Z<p>SuperSte: /* Image pre-processing */</p>
<hr />
<div><br />
== Image pre-processing ==<br />
assuming GIMP:<br />
* Push up the contrast<br />
* Image ==> Mode ==> Indexed<br />
* B/W (1 bit palette)<br />
* Dithering: Floyd-Steinberg<br />
<br />
== Processing code ==<br />
for the conversion from the image file to the pen tip path<br />
<br />
<pre><br />
import toxi.geom.*;<br />
<br />
// tsp variables <br />
int particleRouteLength;<br />
Vec2D[] particles;<br />
int[] particleRoute;<br />
int maxParticles;<br />
<br />
// image variable<br />
PImage img; <br />
<br />
float millisLastFrame = 0;<br />
float frameTime = 0;<br />
// scale of the drawing<br />
float s = 2.0;<br />
<br />
void setup() {<br />
<br />
maxParticles = 15000;<br />
//img = loadImage("lenna-lg_BW_loRes.png");<br />
//img = loadImage("test.png");<br />
img = loadImage("lenna_BW_loRes2.png");<br />
size(img.width*(int)s, img.height*(int)s);<br />
//size(400, 600);<br />
// count black pixels<br />
int i;<br />
maxParticles = 0;<br />
for ( int x = 0; x < img.width; x++ ) {<br />
for ( int y = 0; y < img.height; y++ ) { <br />
i = ( ( y * img.width ) + x ); // getting pixel index<br />
if ( img.pixels[i] == color( 0, 0, 0 ) ) {<br />
maxParticles++;<br />
}<br />
}<br />
}<br />
<br />
println("black dots: " + maxParticles);<br />
// allocate and fill points vector<br />
particles = new Vec2D[maxParticles];<br />
i = 0;<br />
int j = 0;<br />
for ( int x = 0; x < img.width; x++ ) {<br />
for ( int y = 0; y < img.height; y++ ) { <br />
i = ( ( y * img.width ) + x );<br />
if ( img.pixels[i] == color( 0, 0, 0 ) ) {<br />
Vec2D p1 = new Vec2D(x, y);<br />
particles[j] = p1;<br />
j++;<br />
}<br />
}<br />
}<br />
millisLastFrame = millis();<br />
initPath(); // initialize path (NN heuristic)<br />
for (int l = 0; l < 5; l++ ) {<br />
// optimize path with 2-opt heuristic<br />
for (int k = 0; k < 5000; k++ ) optimizePath();<br />
// profiling ...<br />
frameTime = (millis() - millisLastFrame)/1000;<br />
millisLastFrame = millis();<br />
println("Frame time: " + millisLastFrame);<br />
}<br />
noLoop();<br />
}<br />
<br />
void initPath()<br />
{ <br />
int temp;<br />
println("initializing path (NN)");<br />
Vec2D p1, p2;<br />
particleRouteLength = maxParticles;<br />
// array of free ramaining particles to be queried<br />
boolean freeParticles[] = new boolean[maxParticles]; <br />
particleRoute = new int[particleRouteLength]; <br />
int closestParticle;<br />
float distMin;<br />
p1 = particles[0];<br />
freeParticles[0] = true;<br />
particleRoute[0] = 0;<br />
// Nearest neighbor ("Simple, Greedy") algorithm path optimization:<br />
int i = 0, j;<br />
float dx, dy, distance; <br />
while (i < particleRouteLength) {<br />
distMin = Float.MAX_VALUE; // re-initialize mimimun distance value<br />
closestParticle = 0; // re-initialize closest particle<br />
for (j = 0; j < particleRouteLength; j++) {<br />
if (freeParticles[j] == false) {<br />
p2 = particles[j]; // get next particle to calculate distance<br />
dx = p1.x - p2.x;<br />
dy = p1.y - p2.y;<br />
distance = (float) (dx*dx+dy*dy); // Only looking for closest; do not need sqrt factor!<br />
if (distance < distMin) {<br />
closestParticle = j; // update the closest particle index<br />
distMin = distance; // update the minimum distance value<br />
}<br />
}<br />
}<br />
freeParticles[closestParticle] = true; // remove the particle from the ones to be queried<br />
particleRoute[i] = closestParticle; //set the next particle in the path<br />
i++; // increment while counter<br />
}<br />
// Initial routing is complete<br />
frameTime = (millis() - millisLastFrame)/1000;<br />
millisLastFrame = millis();<br />
println("Frame time: " + millisLastFrame);<br />
}<br />
<br />
void optimizePath() {<br />
// 2-opt heuristic optimization:<br />
// Identify a pair of edges that would become shorter by reversing part of the tour.<br />
int temp;<br />
//println("optimizing path (2-opt) " );<br />
for (int i = 0; i < 5000; ++i) { // 1000 tests per frame; you can edit this number.<br />
int indexA = floor(random(particleRouteLength - 1));<br />
int indexB = floor(random(particleRouteLength - 1));<br />
if (Math.abs(indexA - indexB) < 2)<br />
continue;<br />
if (indexB < indexA) { // swap A, B.<br />
temp = indexB;<br />
indexB = indexA;<br />
indexA = temp;<br />
}<br />
<br />
Vec2D a0 = particles[particleRoute[indexA]];<br />
Vec2D a1 = particles[particleRoute[indexA + 1]];<br />
Vec2D b0 = particles[particleRoute[indexB]];<br />
Vec2D b1 = particles[particleRoute[indexB + 1]];<br />
<br />
// Original distance:<br />
float dx = a0.x - a1.x;<br />
float dy = a0.y - a1.y;<br />
float distance = (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
dx = b0.x - b1.x;<br />
dy = b0.y - b1.y;<br />
distance += (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
// Possible shorter distance?<br />
dx = a0.x - b0.x;<br />
dy = a0.y - b0.y;<br />
float distance2 = (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
dx = a1.x - b1.x;<br />
dy = a1.y - b1.y;<br />
distance2 += (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
<br />
if (distance2 < distance) { // Reverse tour between a1 and b0. <br />
int indexhigh = indexB;<br />
int indexlow = indexA + 1;<br />
while (indexhigh > indexlow) {<br />
temp = particleRoute[indexlow];<br />
particleRoute[indexlow] = particleRoute[indexhigh];<br />
particleRoute[indexhigh] = temp;<br />
indexhigh--;<br />
indexlow++;<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
void draw() {<br />
//image(img, 0, 0);<br />
image(img, width*s, height*s);<br />
int i = 0;<br />
stroke(128, 128, 255); // Stroke color (blue)<br />
strokeWeight (.5); // stroke weight<br />
println("in draw, n.part : " + particleRouteLength);<br />
<br />
// loop the particles drawing a line between successive points<br />
for ( i = 0; i < (particleRouteLength - 1); ++i) {<br />
Vec2D p1 = particles[particleRoute[i]];<br />
Vec2D p2 = particles[particleRoute[i + 1]];<br />
line(p1.x*s, p1.y*s, p2.x*s, p2.y*s);<br />
}<br />
}<br />
</pre><br />
<br />
----<br />
<br />
== python code ==<br />
for the low level controller<br />
<br />
<pre><br />
from time import sleep<br />
from math import pi<br />
import RPi.GPIO as GPIO<br />
<br />
# systems parameters<br />
r_p = 18.0 #............... pulley radius [mm]<br />
d_p = 1500.0 #............. pulley distance [mm]<br />
d_p05 = dp * 0.5 #......... half pulley distance [mm]<br />
s_a = 3.5 * (2*pi/360) #... step angle [rad]<br />
<br />
# drawing parameters<br />
s = 2.0 #.................. drawing scale [-]<br />
<br />
# initialize output pins<br />
GPIO.setup(13, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
<br />
<br />
pos = [240, 240] #.... set initial position vector (x,Y)<br />
len_curr = getStringsLen(pos_init, d_p05, s) # get initial string<br />
<br />
for i in list<br />
pos_next = path[i]<br />
len_next = getStringsLen(pos_next, d_p05, s)<br />
dl = len_next - len_curr<br />
ds = dl/s_a<br />
<br />
<br />
def getStringsLen(pos_xy, halfPullDist, scale)<br />
x2 = (pos_xy[0] * scale)**2<br />
x2b2 = (halfPullDist - pos_xy[0] * scale)**2<br />
y2 = (pos_xy[1] * scale)**2<br />
return [sqrt(x2+y2) , sqrt(x2b2+y2)]<br />
</pre></div>SuperStehttps://fablabgenova.it/index.php?title=Software&diff=57Software2013-02-13T13:55:02Z<p>SuperSte: /* Processing code */</p>
<hr />
<div><br />
== Image pre-processing ==<br />
(assuming GIMP):<br />
* Push up the contrast<br />
* Image ==> Mode ==> Indexed<br />
* B/W (1 bit palette)<br />
* Dithering: Floyd-Steinberg<br />
<br />
<br />
== Processing code ==<br />
for the conversion from the image file to the pen tip path<br />
<br />
<pre><br />
import toxi.geom.*;<br />
<br />
// tsp variables <br />
int particleRouteLength;<br />
Vec2D[] particles;<br />
int[] particleRoute;<br />
int maxParticles;<br />
<br />
// image variable<br />
PImage img; <br />
<br />
float millisLastFrame = 0;<br />
float frameTime = 0;<br />
// scale of the drawing<br />
float s = 2.0;<br />
<br />
void setup() {<br />
<br />
maxParticles = 15000;<br />
//img = loadImage("lenna-lg_BW_loRes.png");<br />
//img = loadImage("test.png");<br />
img = loadImage("lenna_BW_loRes2.png");<br />
size(img.width*(int)s, img.height*(int)s);<br />
//size(400, 600);<br />
// count black pixels<br />
int i;<br />
maxParticles = 0;<br />
for ( int x = 0; x < img.width; x++ ) {<br />
for ( int y = 0; y < img.height; y++ ) { <br />
i = ( ( y * img.width ) + x ); // getting pixel index<br />
if ( img.pixels[i] == color( 0, 0, 0 ) ) {<br />
maxParticles++;<br />
}<br />
}<br />
}<br />
<br />
println("black dots: " + maxParticles);<br />
// allocate and fill points vector<br />
particles = new Vec2D[maxParticles];<br />
i = 0;<br />
int j = 0;<br />
for ( int x = 0; x < img.width; x++ ) {<br />
for ( int y = 0; y < img.height; y++ ) { <br />
i = ( ( y * img.width ) + x );<br />
if ( img.pixels[i] == color( 0, 0, 0 ) ) {<br />
Vec2D p1 = new Vec2D(x, y);<br />
particles[j] = p1;<br />
j++;<br />
}<br />
}<br />
}<br />
millisLastFrame = millis();<br />
initPath(); // initialize path (NN heuristic)<br />
for (int l = 0; l < 5; l++ ) {<br />
// optimize path with 2-opt heuristic<br />
for (int k = 0; k < 5000; k++ ) optimizePath();<br />
// profiling ...<br />
frameTime = (millis() - millisLastFrame)/1000;<br />
millisLastFrame = millis();<br />
println("Frame time: " + millisLastFrame);<br />
}<br />
noLoop();<br />
}<br />
<br />
void initPath()<br />
{ <br />
int temp;<br />
println("initializing path (NN)");<br />
Vec2D p1, p2;<br />
particleRouteLength = maxParticles;<br />
// array of free ramaining particles to be queried<br />
boolean freeParticles[] = new boolean[maxParticles]; <br />
particleRoute = new int[particleRouteLength]; <br />
int closestParticle;<br />
float distMin;<br />
p1 = particles[0];<br />
freeParticles[0] = true;<br />
particleRoute[0] = 0;<br />
// Nearest neighbor ("Simple, Greedy") algorithm path optimization:<br />
int i = 0, j;<br />
float dx, dy, distance; <br />
while (i < particleRouteLength) {<br />
distMin = Float.MAX_VALUE; // re-initialize mimimun distance value<br />
closestParticle = 0; // re-initialize closest particle<br />
for (j = 0; j < particleRouteLength; j++) {<br />
if (freeParticles[j] == false) {<br />
p2 = particles[j]; // get next particle to calculate distance<br />
dx = p1.x - p2.x;<br />
dy = p1.y - p2.y;<br />
distance = (float) (dx*dx+dy*dy); // Only looking for closest; do not need sqrt factor!<br />
if (distance < distMin) {<br />
closestParticle = j; // update the closest particle index<br />
distMin = distance; // update the minimum distance value<br />
}<br />
}<br />
}<br />
freeParticles[closestParticle] = true; // remove the particle from the ones to be queried<br />
particleRoute[i] = closestParticle; //set the next particle in the path<br />
i++; // increment while counter<br />
}<br />
// Initial routing is complete<br />
frameTime = (millis() - millisLastFrame)/1000;<br />
millisLastFrame = millis();<br />
println("Frame time: " + millisLastFrame);<br />
}<br />
<br />
void optimizePath() {<br />
// 2-opt heuristic optimization:<br />
// Identify a pair of edges that would become shorter by reversing part of the tour.<br />
int temp;<br />
//println("optimizing path (2-opt) " );<br />
for (int i = 0; i < 5000; ++i) { // 1000 tests per frame; you can edit this number.<br />
int indexA = floor(random(particleRouteLength - 1));<br />
int indexB = floor(random(particleRouteLength - 1));<br />
if (Math.abs(indexA - indexB) < 2)<br />
continue;<br />
if (indexB < indexA) { // swap A, B.<br />
temp = indexB;<br />
indexB = indexA;<br />
indexA = temp;<br />
}<br />
<br />
Vec2D a0 = particles[particleRoute[indexA]];<br />
Vec2D a1 = particles[particleRoute[indexA + 1]];<br />
Vec2D b0 = particles[particleRoute[indexB]];<br />
Vec2D b1 = particles[particleRoute[indexB + 1]];<br />
<br />
// Original distance:<br />
float dx = a0.x - a1.x;<br />
float dy = a0.y - a1.y;<br />
float distance = (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
dx = b0.x - b1.x;<br />
dy = b0.y - b1.y;<br />
distance += (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
// Possible shorter distance?<br />
dx = a0.x - b0.x;<br />
dy = a0.y - b0.y;<br />
float distance2 = (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
dx = a1.x - b1.x;<br />
dy = a1.y - b1.y;<br />
distance2 += (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
<br />
if (distance2 < distance) { // Reverse tour between a1 and b0. <br />
int indexhigh = indexB;<br />
int indexlow = indexA + 1;<br />
while (indexhigh > indexlow) {<br />
temp = particleRoute[indexlow];<br />
particleRoute[indexlow] = particleRoute[indexhigh];<br />
particleRoute[indexhigh] = temp;<br />
indexhigh--;<br />
indexlow++;<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
void draw() {<br />
//image(img, 0, 0);<br />
image(img, width*s, height*s);<br />
int i = 0;<br />
stroke(128, 128, 255); // Stroke color (blue)<br />
strokeWeight (.5); // stroke weight<br />
println("in draw, n.part : " + particleRouteLength);<br />
<br />
// loop the particles drawing a line between successive points<br />
for ( i = 0; i < (particleRouteLength - 1); ++i) {<br />
Vec2D p1 = particles[particleRoute[i]];<br />
Vec2D p2 = particles[particleRoute[i + 1]];<br />
line(p1.x*s, p1.y*s, p2.x*s, p2.y*s);<br />
}<br />
}<br />
</pre><br />
<br />
----<br />
<br />
== python code ==<br />
for the low level controller<br />
<br />
<pre><br />
from time import sleep<br />
from math import pi<br />
import RPi.GPIO as GPIO<br />
<br />
# systems parameters<br />
r_p = 18.0 #............... pulley radius [mm]<br />
d_p = 1500.0 #............. pulley distance [mm]<br />
d_p05 = dp * 0.5 #......... half pulley distance [mm]<br />
s_a = 3.5 * (2*pi/360) #... step angle [rad]<br />
<br />
# drawing parameters<br />
s = 2.0 #.................. drawing scale [-]<br />
<br />
# initialize output pins<br />
GPIO.setup(13, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
<br />
<br />
pos = [240, 240] #.... set initial position vector (x,Y)<br />
len_curr = getStringsLen(pos_init, d_p05, s) # get initial string<br />
<br />
for i in list<br />
pos_next = path[i]<br />
len_next = getStringsLen(pos_next, d_p05, s)<br />
dl = len_next - len_curr<br />
ds = dl/s_a<br />
<br />
<br />
def getStringsLen(pos_xy, halfPullDist, scale)<br />
x2 = (pos_xy[0] * scale)**2<br />
x2b2 = (halfPullDist - pos_xy[0] * scale)**2<br />
y2 = (pos_xy[1] * scale)**2<br />
return [sqrt(x2+y2) , sqrt(x2b2+y2)]<br />
</pre></div>SuperStehttps://fablabgenova.it/index.php?title=Software&diff=56Software2013-02-13T13:54:38Z<p>SuperSte: </p>
<hr />
<div><br />
== Image pre-processing ==<br />
(assuming GIMP):<br />
* Push up the contrast<br />
* Image ==> Mode ==> Indexed<br />
* B/W (1 bit palette)<br />
* Dithering: Floyd-Steinberg<br />
<br />
<br />
== Processing code ==<br />
for the conversion from the image file to the pen tip path<br />
<br />
<pre><br />
import toxi.geom.*;<br />
<br />
// tsp variables <br />
int particleRouteLength;<br />
Vec2D[] particles;<br />
int[] particleRoute;<br />
int maxParticles;<br />
<br />
// image variable<br />
PImage img; <br />
<br />
float millisLastFrame = 0;<br />
float frameTime = 0;<br />
// scale of the drawing<br />
float s = 2.0;<br />
<br />
void setup() {<br />
<br />
maxParticles = 15000;<br />
//img = loadImage("lenna-lg_BW_loRes.png");<br />
//img = loadImage("test.png");<br />
img = loadImage("lenna_BW_loRes2.png");<br />
size(img.width*(int)s, img.height*(int)s);<br />
//size(400, 600);<br />
// count black pixels<br />
int i;<br />
maxParticles = 0;<br />
for ( int x = 0; x < img.width; x++ ) {<br />
for ( int y = 0; y < img.height; y++ ) { <br />
i = ( ( y * img.width ) + x ); // getting pixel index<br />
if ( img.pixels[i] == color( 0, 0, 0 ) ) {<br />
maxParticles++;<br />
}<br />
}<br />
}<br />
<br />
println("black dots: " + maxParticles);<br />
// allocate and fill points vector<br />
particles = new Vec2D[maxParticles];<br />
i = 0;<br />
int j = 0;<br />
for ( int x = 0; x < img.width; x++ ) {<br />
for ( int y = 0; y < img.height; y++ ) { <br />
i = ( ( y * img.width ) + x );<br />
if ( img.pixels[i] == color( 0, 0, 0 ) ) {<br />
Vec2D p1 = new Vec2D(x, y);<br />
particles[j] = p1;<br />
j++;<br />
}<br />
}<br />
}<br />
millisLastFrame = millis();<br />
initPath(); // initialize path (NN heuristic)<br />
for (int l = 0; l < 5; l++ ) {<br />
// optimize path with 2-opt heuristic<br />
for (int k = 0; k < 5000; k++ ) optimizePath();<br />
// profiling ...<br />
frameTime = (millis() - millisLastFrame)/1000;<br />
millisLastFrame = millis();<br />
println("Frame time: " + millisLastFrame);<br />
}<br />
noLoop();<br />
}<br />
<br />
void initPath()<br />
{ <br />
int temp;<br />
println("initializing path (NN)");<br />
Vec2D p1, p2;<br />
particleRouteLength = maxParticles;<br />
// array of free ramaining particles to be queried<br />
boolean freeParticles[] = new boolean[maxParticles]; <br />
particleRoute = new int[particleRouteLength]; <br />
int closestParticle;<br />
float distMin;<br />
p1 = particles[0];<br />
freeParticles[0] = true;<br />
particleRoute[0] = 0;<br />
// Nearest neighbor ("Simple, Greedy") algorithm path optimization:<br />
int i = 0, j;<br />
float dx, dy, distance; <br />
while (i < particleRouteLength) {<br />
distMin = Float.MAX_VALUE; // re-initialize mimimun distance value<br />
closestParticle = 0; // re-initialize closest particle<br />
for (j = 0; j < particleRouteLength; j++) {<br />
if (freeParticles[j] == false) {<br />
p2 = particles[j]; // get next particle to calculate distance<br />
dx = p1.x - p2.x;<br />
dy = p1.y - p2.y;<br />
distance = (float) (dx*dx+dy*dy); // Only looking for closest; do not need sqrt factor!<br />
if (distance < distMin) {<br />
closestParticle = j; // update the closest particle index<br />
distMin = distance; // update the minimum distance value<br />
}<br />
}<br />
}<br />
freeParticles[closestParticle] = true; // remove the particle from the ones to be queried<br />
particleRoute[i] = closestParticle; //set the next particle in the path<br />
i++; // increment while counter<br />
}<br />
// Initial routing is complete<br />
frameTime = (millis() - millisLastFrame)/1000;<br />
millisLastFrame = millis();<br />
println("Frame time: " + millisLastFrame);<br />
}<br />
<br />
void optimizePath() {<br />
// 2-opt heuristic optimization:<br />
// Identify a pair of edges that would become shorter by reversing part of the tour.<br />
int temp;<br />
//println("optimizing path (2-opt) " );<br />
for (int i = 0; i < 5000; ++i) { // 1000 tests per frame; you can edit this number.<br />
int indexA = floor(random(particleRouteLength - 1));<br />
int indexB = floor(random(particleRouteLength - 1));<br />
if (Math.abs(indexA - indexB) < 2)<br />
continue;<br />
if (indexB < indexA) { // swap A, B.<br />
temp = indexB;<br />
indexB = indexA;<br />
indexA = temp;<br />
}<br />
<br />
Vec2D a0 = particles[particleRoute[indexA]];<br />
Vec2D a1 = particles[particleRoute[indexA + 1]];<br />
Vec2D b0 = particles[particleRoute[indexB]];<br />
Vec2D b1 = particles[particleRoute[indexB + 1]];<br />
<br />
// Original distance:<br />
float dx = a0.x - a1.x;<br />
float dy = a0.y - a1.y;<br />
float distance = (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
dx = b0.x - b1.x;<br />
dy = b0.y - b1.y;<br />
distance += (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
// Possible shorter distance?<br />
dx = a0.x - b0.x;<br />
dy = a0.y - b0.y;<br />
float distance2 = (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
dx = a1.x - b1.x;<br />
dy = a1.y - b1.y;<br />
distance2 += (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
<br />
if (distance2 < distance) { // Reverse tour between a1 and b0. <br />
int indexhigh = indexB;<br />
int indexlow = indexA + 1;<br />
while (indexhigh > indexlow) {<br />
temp = particleRoute[indexlow];<br />
particleRoute[indexlow] = particleRoute[indexhigh];<br />
particleRoute[indexhigh] = temp;<br />
indexhigh--;<br />
indexlow++;<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
void draw() {<br />
//image(img, 0, 0);<br />
image(img, width*s, height*s);<br />
int i = 0;<br />
stroke(128, 128, 255); // Stroke color (blue)<br />
strokeWeight (.5); // stroke weight<br />
println("in draw, n.part : " + particleRouteLength);<br />
<br />
// loop the particles drawing a line between successive points<br />
for ( i = 0; i < (particleRouteLength - 1); ++i) {<br />
Vec2D p1 = particles[particleRoute[i]];<br />
Vec2D p2 = particles[particleRoute[i + 1]];<br />
line(p1.x*s, p1.y*s, p2.x*s, p2.y*s);<br />
}<br />
}<br />
</pre><br />
<br />
----<br />
<br />
<br />
== python code ==<br />
for the low level controller<br />
<br />
<pre><br />
from time import sleep<br />
from math import pi<br />
import RPi.GPIO as GPIO<br />
<br />
# systems parameters<br />
r_p = 18.0 #............... pulley radius [mm]<br />
d_p = 1500.0 #............. pulley distance [mm]<br />
d_p05 = dp * 0.5 #......... half pulley distance [mm]<br />
s_a = 3.5 * (2*pi/360) #... step angle [rad]<br />
<br />
# drawing parameters<br />
s = 2.0 #.................. drawing scale [-]<br />
<br />
# initialize output pins<br />
GPIO.setup(13, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
<br />
<br />
pos = [240, 240] #.... set initial position vector (x,Y)<br />
len_curr = getStringsLen(pos_init, d_p05, s) # get initial string<br />
<br />
for i in list<br />
pos_next = path[i]<br />
len_next = getStringsLen(pos_next, d_p05, s)<br />
dl = len_next - len_curr<br />
ds = dl/s_a<br />
<br />
<br />
def getStringsLen(pos_xy, halfPullDist, scale)<br />
x2 = (pos_xy[0] * scale)**2<br />
x2b2 = (halfPullDist - pos_xy[0] * scale)**2<br />
y2 = (pos_xy[1] * scale)**2<br />
return [sqrt(x2+y2) , sqrt(x2b2+y2)]<br />
</pre></div>SuperStehttps://fablabgenova.it/index.php?title=Software&diff=55Software2013-02-13T12:07:27Z<p>SuperSte: </p>
<hr />
<div>Processing code for the conversion from the image file to the pen tip path<br />
<br />
<pre><br />
import toxi.geom.*;<br />
<br />
// tsp variables <br />
int particleRouteLength;<br />
Vec2D[] particles;<br />
int[] particleRoute;<br />
int maxParticles;<br />
<br />
// image variable<br />
PImage img; <br />
<br />
float millisLastFrame = 0;<br />
float frameTime = 0;<br />
// scale of the drawing<br />
float s = 2.0;<br />
<br />
void setup() {<br />
<br />
maxParticles = 15000;<br />
//img = loadImage("lenna-lg_BW_loRes.png");<br />
//img = loadImage("test.png");<br />
img = loadImage("lenna_BW_loRes2.png");<br />
size(img.width*(int)s, img.height*(int)s);<br />
//size(400, 600);<br />
// count black pixels<br />
int i;<br />
maxParticles = 0;<br />
for ( int x = 0; x < img.width; x++ ) {<br />
for ( int y = 0; y < img.height; y++ ) { <br />
i = ( ( y * img.width ) + x ); // getting pixel index<br />
if ( img.pixels[i] == color( 0, 0, 0 ) ) {<br />
maxParticles++;<br />
}<br />
}<br />
}<br />
<br />
println("black dots: " + maxParticles);<br />
// allocate and fill points vector<br />
particles = new Vec2D[maxParticles];<br />
i = 0;<br />
int j = 0;<br />
for ( int x = 0; x < img.width; x++ ) {<br />
for ( int y = 0; y < img.height; y++ ) { <br />
i = ( ( y * img.width ) + x );<br />
if ( img.pixels[i] == color( 0, 0, 0 ) ) {<br />
Vec2D p1 = new Vec2D(x, y);<br />
particles[j] = p1;<br />
j++;<br />
}<br />
}<br />
}<br />
millisLastFrame = millis();<br />
initPath(); // initialize path (NN heuristic)<br />
for (int l = 0; l < 5; l++ ) {<br />
// optimize path with 2-opt heuristic<br />
for (int k = 0; k < 5000; k++ ) optimizePath();<br />
// profiling ...<br />
frameTime = (millis() - millisLastFrame)/1000;<br />
millisLastFrame = millis();<br />
println("Frame time: " + millisLastFrame);<br />
}<br />
noLoop();<br />
}<br />
<br />
void initPath()<br />
{ <br />
int temp;<br />
println("initializing path (NN)");<br />
Vec2D p1, p2;<br />
particleRouteLength = maxParticles;<br />
// array of free ramaining particles to be queried<br />
boolean freeParticles[] = new boolean[maxParticles]; <br />
particleRoute = new int[particleRouteLength]; <br />
int closestParticle;<br />
float distMin;<br />
p1 = particles[0];<br />
freeParticles[0] = true;<br />
particleRoute[0] = 0;<br />
// Nearest neighbor ("Simple, Greedy") algorithm path optimization:<br />
int i = 0, j;<br />
float dx, dy, distance; <br />
while (i < particleRouteLength) {<br />
distMin = Float.MAX_VALUE; // re-initialize mimimun distance value<br />
closestParticle = 0; // re-initialize closest particle<br />
for (j = 0; j < particleRouteLength; j++) {<br />
if (freeParticles[j] == false) {<br />
p2 = particles[j]; // get next particle to calculate distance<br />
dx = p1.x - p2.x;<br />
dy = p1.y - p2.y;<br />
distance = (float) (dx*dx+dy*dy); // Only looking for closest; do not need sqrt factor!<br />
if (distance < distMin) {<br />
closestParticle = j; // update the closest particle index<br />
distMin = distance; // update the minimum distance value<br />
}<br />
}<br />
}<br />
freeParticles[closestParticle] = true; // remove the particle from the ones to be queried<br />
particleRoute[i] = closestParticle; //set the next particle in the path<br />
i++; // increment while counter<br />
}<br />
// Initial routing is complete<br />
frameTime = (millis() - millisLastFrame)/1000;<br />
millisLastFrame = millis();<br />
println("Frame time: " + millisLastFrame);<br />
}<br />
<br />
void optimizePath() {<br />
// 2-opt heuristic optimization:<br />
// Identify a pair of edges that would become shorter by reversing part of the tour.<br />
int temp;<br />
//println("optimizing path (2-opt) " );<br />
for (int i = 0; i < 5000; ++i) { // 1000 tests per frame; you can edit this number.<br />
int indexA = floor(random(particleRouteLength - 1));<br />
int indexB = floor(random(particleRouteLength - 1));<br />
if (Math.abs(indexA - indexB) < 2)<br />
continue;<br />
if (indexB < indexA) { // swap A, B.<br />
temp = indexB;<br />
indexB = indexA;<br />
indexA = temp;<br />
}<br />
<br />
Vec2D a0 = particles[particleRoute[indexA]];<br />
Vec2D a1 = particles[particleRoute[indexA + 1]];<br />
Vec2D b0 = particles[particleRoute[indexB]];<br />
Vec2D b1 = particles[particleRoute[indexB + 1]];<br />
<br />
// Original distance:<br />
float dx = a0.x - a1.x;<br />
float dy = a0.y - a1.y;<br />
float distance = (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
dx = b0.x - b1.x;<br />
dy = b0.y - b1.y;<br />
distance += (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
// Possible shorter distance?<br />
dx = a0.x - b0.x;<br />
dy = a0.y - b0.y;<br />
float distance2 = (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
dx = a1.x - b1.x;<br />
dy = a1.y - b1.y;<br />
distance2 += (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
<br />
if (distance2 < distance) { // Reverse tour between a1 and b0. <br />
int indexhigh = indexB;<br />
int indexlow = indexA + 1;<br />
while (indexhigh > indexlow) {<br />
temp = particleRoute[indexlow];<br />
particleRoute[indexlow] = particleRoute[indexhigh];<br />
particleRoute[indexhigh] = temp;<br />
indexhigh--;<br />
indexlow++;<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
void draw() {<br />
//image(img, 0, 0);<br />
image(img, width*s, height*s);<br />
int i = 0;<br />
stroke(128, 128, 255); // Stroke color (blue)<br />
strokeWeight (.5); // stroke weight<br />
println("in draw, n.part : " + particleRouteLength);<br />
<br />
// loop the particles drawing a line between successive points<br />
for ( i = 0; i < (particleRouteLength - 1); ++i) {<br />
Vec2D p1 = particles[particleRoute[i]];<br />
Vec2D p2 = particles[particleRoute[i + 1]];<br />
line(p1.x*s, p1.y*s, p2.x*s, p2.y*s);<br />
}<br />
}<br />
</pre><br />
<br />
----<br />
<br />
preliminary python code for the low level controller<br />
<br />
<pre><br />
from time import sleep<br />
from math import pi<br />
import RPi.GPIO as GPIO<br />
<br />
# systems parameters<br />
r_p = 18.0 #............... pulley radius [mm]<br />
d_p = 1500.0 #............. pulley distance [mm]<br />
d_p05 = dp * 0.5 #......... half pulley distance [mm]<br />
s_a = 3.5 * (2*pi/360) #... step angle [rad]<br />
<br />
# drawing parameters<br />
s = 2.0 #.................. drawing scale [-]<br />
<br />
# initialize output pins<br />
GPIO.setup(13, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
<br />
<br />
pos = [240, 240] #.... set initial position vector (x,Y)<br />
len_curr = getStringsLen(pos_init, d_p05, s) # get initial string<br />
<br />
for i in list<br />
pos_next = path[i]<br />
len_next = getStringsLen(pos_next, d_p05, s)<br />
dl = len_next - len_curr<br />
ds = dl/s_a<br />
<br />
<br />
def getStringsLen(pos_xy, halfPullDist, scale)<br />
x2 = (pos_xy[0] * scale)**2<br />
x2b2 = (halfPullDist - pos_xy[0] * scale)**2<br />
y2 = (pos_xy[1] * scale)**2<br />
return [sqrt(x2+y2) , sqrt(x2b2+y2)]<br />
</pre></div>SuperStehttps://fablabgenova.it/index.php?title=Software&diff=54Software2013-02-13T07:59:53Z<p>SuperSte: </p>
<hr />
<div>processing code for the conversion from the image file to the pen tip path<br />
<br />
<code><br />
<br />
import toxi.geom.*;<br />
<br />
// tsp variables <br />
int particleRouteLength;<br />
Vec2D[] particles;<br />
int[] particleRoute;<br />
int maxParticles;<br />
<br />
// image variable<br />
PImage img; <br />
<br />
float millisLastFrame = 0;<br />
float frameTime = 0;<br />
// scale of the drawing<br />
float s = 2.0;<br />
<br />
void setup() {<br />
<br />
maxParticles = 15000;<br />
//img = loadImage("lenna-lg_BW_loRes.png");<br />
//img = loadImage("test.png");<br />
img = loadImage("lenna_BW_loRes2.png");<br />
size(img.width*(int)s, img.height*(int)s);<br />
//size(400, 600);<br />
// count black pixels<br />
int i;<br />
maxParticles = 0;<br />
for ( int x = 0; x < img.width; x++ ) {<br />
for ( int y = 0; y < img.height; y++ ) { <br />
i = ( ( y * img.width ) + x ); // getting pixel index<br />
if ( img.pixels[i] == color( 0, 0, 0 ) ) {<br />
maxParticles++;<br />
}<br />
}<br />
}<br />
<br />
println("black dots: " + maxParticles);<br />
// allocate and fill points vector<br />
particles = new Vec2D[maxParticles];<br />
i = 0;<br />
int j = 0;<br />
for ( int x = 0; x < img.width; x++ ) {<br />
for ( int y = 0; y < img.height; y++ ) { <br />
i = ( ( y * img.width ) + x );<br />
if ( img.pixels[i] == color( 0, 0, 0 ) ) {<br />
Vec2D p1 = new Vec2D(x, y);<br />
particles[j] = p1;<br />
j++;<br />
}<br />
}<br />
}<br />
millisLastFrame = millis();<br />
initPath(); // initialize path (NN heuristic)<br />
for (int l = 0; l < 5; l++ ) {<br />
// optimize path with 2-opt heuristic<br />
for (int k = 0; k < 5000; k++ ) optimizePath();<br />
// profiling ...<br />
frameTime = (millis() - millisLastFrame)/1000;<br />
millisLastFrame = millis();<br />
println("Frame time: " + millisLastFrame);<br />
}<br />
noLoop();<br />
}<br />
<br />
void initPath()<br />
{ <br />
int temp;<br />
println("initializing path (NN)");<br />
Vec2D p1, p2;<br />
particleRouteLength = maxParticles;<br />
// array of free ramaining particles to be queried<br />
boolean freeParticles[] = new boolean[maxParticles]; <br />
particleRoute = new int[particleRouteLength]; <br />
int closestParticle;<br />
float distMin;<br />
p1 = particles[0];<br />
freeParticles[0] = true;<br />
particleRoute[0] = 0;<br />
// Nearest neighbor ("Simple, Greedy") algorithm path optimization:<br />
int i = 0, j;<br />
float dx, dy, distance; <br />
while (i < particleRouteLength) {<br />
distMin = Float.MAX_VALUE; // re-initialize mimimun distance value<br />
closestParticle = 0; // re-initialize closest particle<br />
for (j = 0; j < particleRouteLength; j++) {<br />
if (freeParticles[j] == false) {<br />
p2 = particles[j]; // get next particle to calculate distance<br />
dx = p1.x - p2.x;<br />
dy = p1.y - p2.y;<br />
distance = (float) (dx*dx+dy*dy); // Only looking for closest; do not need sqrt factor!<br />
if (distance < distMin) {<br />
closestParticle = j; // update the closest particle index<br />
distMin = distance; // update the minimum distance value<br />
}<br />
}<br />
}<br />
freeParticles[closestParticle] = true; // remove the particle from the ones to be queried<br />
particleRoute[i] = closestParticle; //set the next particle in the path<br />
i++; // increment while counter<br />
}<br />
// Initial routing is complete<br />
frameTime = (millis() - millisLastFrame)/1000;<br />
millisLastFrame = millis();<br />
println("Frame time: " + millisLastFrame);<br />
}<br />
<br />
void optimizePath() {<br />
// 2-opt heuristic optimization:<br />
// Identify a pair of edges that would become shorter by reversing part of the tour.<br />
int temp;<br />
//println("optimizing path (2-opt) " );<br />
for (int i = 0; i < 5000; ++i) { // 1000 tests per frame; you can edit this number.<br />
int indexA = floor(random(particleRouteLength - 1));<br />
int indexB = floor(random(particleRouteLength - 1));<br />
if (Math.abs(indexA - indexB) < 2)<br />
continue;<br />
if (indexB < indexA) { // swap A, B.<br />
temp = indexB;<br />
indexB = indexA;<br />
indexA = temp;<br />
}<br />
<br />
Vec2D a0 = particles[particleRoute[indexA]];<br />
Vec2D a1 = particles[particleRoute[indexA + 1]];<br />
Vec2D b0 = particles[particleRoute[indexB]];<br />
Vec2D b1 = particles[particleRoute[indexB + 1]];<br />
<br />
// Original distance:<br />
float dx = a0.x - a1.x;<br />
float dy = a0.y - a1.y;<br />
float distance = (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
dx = b0.x - b1.x;<br />
dy = b0.y - b1.y;<br />
distance += (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
// Possible shorter distance?<br />
dx = a0.x - b0.x;<br />
dy = a0.y - b0.y;<br />
float distance2 = (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
dx = a1.x - b1.x;<br />
dy = a1.y - b1.y;<br />
distance2 += (float) (dx*dx+dy*dy); // only a comparison; do not need sqrt factor! <br />
<br />
if (distance2 < distance) { // Reverse tour between a1 and b0. <br />
int indexhigh = indexB;<br />
int indexlow = indexA + 1;<br />
while (indexhigh > indexlow) {<br />
temp = particleRoute[indexlow];<br />
particleRoute[indexlow] = particleRoute[indexhigh];<br />
particleRoute[indexhigh] = temp;<br />
indexhigh--;<br />
indexlow++;<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
void draw() {<br />
//image(img, 0, 0);<br />
image(img, width*s, height*s);<br />
int i = 0;<br />
stroke(128, 128, 255); // Stroke color (blue)<br />
strokeWeight (.5); // stroke weight<br />
println("in draw, n.part : " + particleRouteLength);<br />
<br />
// loop the particles drawing a line between successive points<br />
for ( i = 0; i < (particleRouteLength - 1); ++i) {<br />
Vec2D p1 = particles[particleRoute[i]];<br />
Vec2D p2 = particles[particleRoute[i + 1]];<br />
line(p1.x*s, p1.y*s, p2.x*s, p2.y*s);<br />
}<br />
}<br />
</code><br />
<br />
----<br />
<br />
preliminary python code for the low level controller<br />
<br />
<code><br />
<br />
from time import sleep<br />
from math import pi<br />
import RPi.GPIO as GPIO<br />
<br />
# systems parameters<br />
r_p = 18.0 #............... pulley radius [mm]<br />
d_p = 1500.0 #............. pulley distance [mm]<br />
d_p05 = dp * 0.5 #......... half pulley distance [mm]<br />
s_a = 3.5 * (2*pi/360) #... step angle [rad]<br />
<br />
# drawing parameters<br />
s = 2.0 #.................. drawing scale [-]<br />
<br />
# initialize output pins<br />
GPIO.setup(13, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
#GPIO.setup(16, GPIO.OUT)<br />
#GPIO.setup(15, GPIO.OUT)<br />
<br />
<br />
pos = [240, 240] #.... set initial position vector (x,Y)<br />
len_curr = getStringsLen(pos_init, d_p05, s) # get initial string<br />
<br />
for i in list<br />
pos_next = path[i]<br />
len_next = getStringsLen(pos_next, d_p05, s)<br />
dl = len_next - len_curr<br />
ds = dl/s_a<br />
<br />
<br />
def getStringsLen(pos_xy, halfPullDist, scale)<br />
x2 = (pos_xy[0] * scale)**2<br />
x2b2 = (halfPullDist - pos_xy[0] * scale)**2<br />
y2 = (pos_xy[1] * scale)**2<br />
return [sqrt(x2+y2) , sqrt(x2b2+y2)]<br />
</code></div>SuperSte