Merge branch 'master' of github.com:c3d2/pentabug

Conflicts:
	firmware/Makefile
This commit is contained in:
Thammi 2015-03-11 21:36:15 +01:00
commit abeced81a2
27 changed files with 6360 additions and 2849 deletions

View File

@ -3,17 +3,20 @@ pentabug
The pentabug is a small microcontroller soldering project. It's especially suited for young hackers and beginners of all ages. Assembly requires no prior soldering skills and can be accomplished - with a little help for the tricky parts - by children old enough to savely hold a soldering iron (thats about 7 years and up). The pentabug is a small microcontroller soldering project. It's especially suited for young hackers and beginners of all ages. Assembly requires no prior soldering skills and can be accomplished - with a little help for the tricky parts - by children old enough to savely hold a soldering iron (thats about 7 years and up).
At the event [Datenspuren 2012](http://datenspuren.de/2012/ "Datenspuren 2012") nearly 80 kits from our first production run of 100 PCBs have been successfully assembled with just one bug in need of special treatment for a controller mounted the wrong way. Have a look at our [slides in german](/c3d2/pentabug/raw/master/doc/201210_slides_datenspuren.pdf "slides form the Datenspuren 2012 talk") from the accompanying [presentation](http://www.datenspuren.de/2012/fahrplan/events/5074.de.html "pentabug talk announcement"). A video of this session will be available soon. At various events, e.g. [Datenspuren 2012 and 2013](http://datenspuren.de "Datenspuren 2012 and 2013"), Chaos Communication Congress 2012+2013, and many more, several hundred kits have been successfully assembled with just a handfull of bugs needing 'special treatment' for e.g. a controller mounted the wrong way. Have a look at our [slides in german](/c3d2/pentabug/raw/master/doc/201210_slides_datenspuren.pdf "slides form the Datenspuren 2012 talk") from the accompanying [presentation](http://www.datenspuren.de/2012/fahrplan/events/5074.de.html "pentabug talk announcement") or watch [this video](http://www.youtube.com/watch?v=HTBhXqNR6LY "Dresdner Piratencast Folge 14 - Datenspuren") of Frank and his sons beeing interviewed at our workshop table.
Meanwhile you can watch [this video](http://www.youtube.com/watch?v=HTBhXqNR6LY "Dresdner Piratencast Folge 14 - Datenspuren") of Frank and his sons beeing interviewed at our workshop table.
A complete walktrough of the assembly process is given in ["Pentabug - The Movie"](http://www.c3d2.de/news/video-pentabug-bauen.html "Pentabug - The Movie"), courtesy of [C3D2 - Chaos Computer Club Dresden](http://c3d2.de "C3D2 - Chaos Computer Club Dresden"). It would be amazing if Scott Manley could do an english version ;-).
![Assembled V2 PCB with extension boards](https://github.com/c3d2/pentabug/raw/master/img/assembled_v2_728x483.jpg)
Img. 1: A completely assembled V2 PCB with extension boards.
![Slightly Advanced Prototype Hardware](https://github.com/c3d2/pentabug/raw/master/img/prototype.jpg) ![Slightly Advanced Prototype Hardware](https://github.com/c3d2/pentabug/raw/master/img/prototype.jpg)
Img. 1: A slightly advanced prototype version of the bug with single layer pcb. Img. 2: A slightly advanced (but early) prototype version of the bug with a single layer pcb.
![Top Layer of Version 1.0 Board](https://github.com/c3d2/pentabug/raw/master/img/board_top.png) ![Top Layer of Version 1.0 Board](https://github.com/c3d2/pentabug/raw/master/img/board_top.png)
Img. 2: The top layer view of the Version 1.0 production board (two layer pcb). Img. 3: The top layer view of the Version 1.0 production board (two layer pcb).
![Version 1.0 Schematics (Thumbnail)](https://github.com/c3d2/pentabug/raw/master/img/schematics_v1_0_thumb.png) ![Version 1.0 Schematics (Thumbnail)](https://github.com/c3d2/pentabug/raw/master/img/schematics_v1_0_thumb.png)
Img. 3: Version 1.0 schematics ([high resolution image](https://github.com/c3d2/pentabug/raw/master/img/schematics_v1_0.png "high resolution image of schematics")). Img. 4: Version 1.0 schematics ([high resolution image](https://github.com/c3d2/pentabug/raw/master/img/schematics_v1_0.png "high resolution image of schematics")).
[Bill of Materials for Version 1.0](https://github.com/c3d2/pentabug/blob/master/bom.md "bill of materials") [Bill of Materials for Version 1.0](https://github.com/c3d2/pentabug/blob/master/bom.md "bill of materials")

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
doc/buglogo.eps Normal file

Binary file not shown.

163
doc/buglogo.svg Normal file
View File

@ -0,0 +1,163 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
id="svg2"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="buglogo.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="387.06203"
inkscape:cy="281.09433"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1535"
inkscape:window-height="876"
inkscape:window-x="65"
inkscape:window-y="24"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g3020"
transform="matrix(3.3929814,0,0,3.3929814,-770.00486,-840.10178)">
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
d="m 337.74908,386.92247 c 21.49942,9.34128 41.38432,18.51011 54.13327,24.00919"
id="path8514"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
d="m 288.65143,393.46268 -44.30289,-7.9311 2.52297,21.74267"
id="path8516"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
d="m 313.67114,423.39271 -16.60876,20.06307 19.91901,12.67566"
id="path8518"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
d="m 342.06976,432.81232 -3.42558,25.23208 23.8601,2.37043"
id="path8520"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
d="m 369.82356,429.58275 8.39633,24.60907 22.47077,-6.8099"
id="path8522"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
d="m 353.2315,347.70342 5.2902,-23.20428 22.98561,6.61651"
id="path8524"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
d="m 378.36363,363.57694 17.93197,-16.96585 17.30399,15.32416"
id="path8526"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
d="m 393.71191,384.85867 25.07043,-8.33534 9.07709,19.65288"
id="path8528"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 295.39879,408.7854 c 12.15052,-24.0068 41.57422,-22.22061 41.57422,-22.22061 0,0 -20.06592,-19.06456 -7.68827,-43.52012"
id="path8530"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 295.17167,409.23413 c 58.95859,45.89928 98.97912,2.96487 98.97912,2.96487 0,0 9.05269,-55.82691 -65.11629,-69.26532"
id="path8532"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="M 310.92751,349.05134 274.13319,321.88058 291.133,308.26632"
id="path8534"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 319.32024,411.15324 41.02968,18.19749"
id="path8536"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 337.43789,403.80407 41.02956,18.19744"
id="path8538"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 351.0185,375.76113 41.02968,18.19748"
id="path8540"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 344.14114,357.87561 41.02968,18.19748"
id="path8542"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 294.8742,409.0692 -6.18837,-15.18835 22.84436,-45.1355 17.0054,-5.77417"
id="path8544"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 285.98134,391.19913 -8.79499,-30.87786 30.57241,-11.92044"
id="path8546"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000004;stroke-width:5.13603163;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 293.17299,368.96574 -2.10152,-5.69145 -5.62583,2.55564 -7.63199,-5.03616"
id="path8548"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.9 KiB

39
doc/de/teil_0:prolog.md Normal file
View File

@ -0,0 +1,39 @@
# RTFM: Pentabug
## Vorwort
Lieber Junghacker-Padawan,
dies ist die Dokumentation zum [Pentabug-Projekt](https://github.com/c3d2/pentabug).
Wenn Du sie liest und verinnerlichst, wirst Du Deinen Pentabug von innen bis
aussen kennen. Du wirst wissen, wie er entstanden ist, wie er aufgebaut ist,
welche Fähigkeiten er besitzt und wie Du ihn erweitern kannst.
Doch viel mehr wirst Du selbst gelernt haben, ein Projekt wie den Pentabug zu
realisieren. Du wirst zum Junghacker-Jedi.
## Struktur dieser Dokumentation
Diese Dokumentation ist in verschiedene Teile aufgebaut.
Wir fangen ganz von vorne an und gehen bis ganz zum Ende.
Danach gehen wir noch weiter nach vorne und enden noch weiter hinten.
So kommst Du ganz ohne Basiswissen schnell zu ergebnissen und brauchst nur
jeweils so viel lesen, wie Dich interessiert.
Teil 1: [Episode 2 - Das Gelöt von Pentabug](teil_1:episode_2.md)
Teil 2: Episode 3 - Mögen die Bits mit Dir sein
Teil 3: Episode 1 - Layout und Ätzen
# Teil 1: [Episode 2 - Das Gelöt von Pentabug](teil_1:episode_2.md)
Inhalt soll werden:
- Funktionen des Pentabug
- Wie findet man den richtigen Lötkolben
- Wie lötet man richtig.
- Was machtjedes Bauteil
# Teil 2: Episode 3 - Mögen die Bits mit Dir sein TODO
# Teil 3: Episode 1 - Layout und Ätzen TODO

131
doc/de/teil_1:episode_2.md Normal file
View File

@ -0,0 +1,131 @@
# Das Gelöt von Pentabug
In dieser Episode erfährst Du, junger Padawan, was Dein Pentabug so kann, wie
Du ihn zusammenbaust und dann zum Leben erweckst.
## Was kann son Pentabug eigentlich?
Der Pentabug ist ein kleiner Roboter, den Du selbst zusammebauen und
programmieren kannst. Er ist recht einfach gehalten und gerade für Einsteiger
im Bereich der Elektronik besonders gut geeignet.
Der Pentabug kann leuchten, piepen, sich bewegen, auf Geräusche reagieren,
Infrarot senden und empfangen. Das kann man zum einen dafür nutzen, dass sich
verschiedene Pentabugs unterhalten, zum anderen aber auch um Geräte
fernzusteuern. Zudem ist er erweiterbar, d.h. man kann recht einfach weitere
kleine Schaltungen bauen, die seine Funktionen erweitern.
## Voraussetzungen
Wenn Du einen Pentabug bauen möchtest benötigst Du neben einem Pentabug-Bausatz folgende weitere Dinge:
1. 1 Lötkolben
2. 1 Schwämmchen, feucht. Ein feuchtes Tuch tut es auch.
3. Lötzinn.
4. 1 hitzebeständige Arbeitsunterlage (z.B. kleines Holzbrett oder eine Pappe).
5. 1 Heißklebepistole mit Kleber
6. 1 Seitenschneider
7. 1 Spitzzange (nicht unbedingt zwingend)
Für den Fall, dass Du mal fehler machst, benötigst Du weitere Dinge:
8. 1 Multimeter
9. 1 Lötlutsche und / oder Entlötlitze
### Auswahl des Lötkolbens und des Lötzinns
Der Lötkolben ist ein Werkzeug mit dem man die verschiedenen elektornischen
Bauelemente mit einander verbindet. Er wird mit Strom betrieben und wird sehr
heiß. Diese Hitze nutzt man um Lötzinn zum schmelzen zu bringen, welches dann
sozusagen die elektrischen Bauelemente elektrisch leitend mit einander
verklebt.
Wenn Du noch keinen Lötkolben zur Verfügung hast, also jetzt loslaufen möchtest
um Dir einen zu besorgen, achte darauf, dass er mindestens 25 Watt hat. Wenn er
mehr Watt hat, macht das Löten allerdings mehr Spass, da man pro Lötstelle
nicht so lange auf das Heißwerden warten muss.
Die Spitze sollte nicht zu dick sein; einen Feinlötkolben benötigst Du für
dieses Projekt allerdings auch nicht.
Überlege, ob Du gleich eine kleine Lötstation kaufst. Die hat meistens gleich
einen Halter für den Kolben, ein kleines Schwämmchen dabei und man kann die
Leistung des Lötkolbens regeln.
Ein Beispiel für einen ausreichendes Lötgeröt findet Ihr
[hier](http://www.amazon.de/dp/B000UNM0QY/). [Disclaimer] Da ist auch schon gleich eine
Lötlutsche dabei.
Wenn Ihr nicht gleich einen Lötkolben kaufen wollt, könnt Ihr ihn bestimmt in
einem [Hackerspace](http://hackerspaces.org) in Eurer Nähe ausleihen, um den
PBG zu bauen.
TODO: kann wer was zum Zinn schreiben?
TODO: Da man bei den ganzen Sachen hier immer wieder was besorgen muss sollten
wir auch Tips zum besorgen der Werkzeuge und Elemente geben.
### Auswahl des Multimeters
Das Multimeter ist ein Werkzeug mit dem man verschiedene (deswegen "multi")
elektrische Messgrößen erfassen (d.h. messen, deswegen
["meter"](http://de.wikipedia.org/wiki/Meter)) kann.
Für den Pentabug reicht ein ganz billiges aus dem Baumarkt oder halt auch von
[Amazon](http://www.amazon.de/dp/B003IP80SS/).
## Die Bauteile erklärt
Damit Ihr wisst, was Ihr verbaut, folgt hier noch eine kurze Erklärung der einzelnen Bauteile.
Die Erklärung folgt ist nicht unbedingt die Reihenfolge in der Ihr die Bauteile auch später verbaut.
### Die Platine
TODO: Insert hier Bild von PLatine
Die Platine ist das Bauteil, auf der alle anderen Bauteile befestigt werden. Sie hat für jedes benötigte Bauteil vorgefertigte Löcher / Bohrungen, sowie Beschriftungen. Zusätzlich liegen auf ihr unter dem Lack Kupferleitungen zwischen einigen Löchern. Diese Kupferleitungen sind wie Kabel und dienen dazu, später den Strom zu transportieren.
### Die Batterie
TODO: Insert hier Bild von Batterie
Eine Batterie kennt Ihr.
Sie liefert die benötigte Energie um den Pentabug später zu betreiben. Neben der richtigen Form und Größe gibt es noch weitere wichtige Eigenschaften einer Batterie, die ein Jedi kennen muss:
Eine Batterie hat immer zwei Pole ("+" und "-"). Im inneren dieser Batterie befinden sich an einem Polende viele Elektronen, die gerne an das andere Polende kommen möchten. Da es im inneren der Batterie aber keinen Durchgang gibt, können die Elektronen nur außen herum, wenn man ihnen eine Möglichkeit dazu gibt. Den Weg, den der Pentabug den Elektronen der Batterie bietet, ist der eigentliche Schaltkreis. Die Elektronen werden also von dem einen Pol der Batterie durch die Schaltung des Pentabug, durch alle Bauteile hindurch, zum anderen Pol der Batterie geleitet. Ein bestimmtes, weiter unten besprochenes, Bauteil verhindert, dass die Elektronen immer durch alle Bauteile fließen, sondern nur dann, wenn der Padawan dies wünscht.
Den Wunsch, wie dolle die Elektronen von einem Pol zum anderen wollen, nennt man *Spannung*. Diese Spannung wird in der Einheit *Volt* (V) angegeben. Auf der Batterie ist aufgedruckt, welche Spannung sie liefert. Die Bauteile stellen eine gewisse Hürde auf um überquert zu werden. Diese Hürde nennt man *Widerstand*. Er wird in der Einheit *Ohm* (Ω) angegeben. Dann wäre da noch der Begriff des *Strom*es. Dieser beschreibt (zumindest ungefähr) wie viele Elektronen an einer gewissen Stelle durchfließen.
TODO: URI jetzt noch im Zusammenhang erklären und paar Beispiele geben. Vielleicht auch noch eine weniger abstrakte Beschreibung liefern?
## Auf gehts
Jetzt geht es schon ans Zusammenbauen des Pentabugs. Wenn Du kein Bock auf
lesen hast, haben wir dafür auch ein
[Video](http://c3d2.de/news/video-pentabug-bauen.html) vorbereitet, was gut
erklärt, wie der Pentabug gelötet wird.
Während Du jetzt also das Lichtschwert eines jeden Junghackers, also den
Lötkolben an der Steckdose heiß werden lässt, packe die einzelnen Bauteile des
Pentabug vor Dir aus und schaue sie genau an. Am besten sortierst Du sie, damit
Du sie schnell griffbereit hast.
In der PBG-Kiste ist auch ein Zettel, der die nötigsten Informationen
zusammenfasst. Bei einigen Bauteilen muss man aufpassen, in welcher Richtung
man sie einbaut.
Die Bauteile werden in der Reihenfolge verbaut, in der sie auf dem Zettel
stehen. Das macht man deswegen, weil man später an manche Bauteile nicht mehr
so gut rankommt, wenn rundherum schon viele andere Teile verbaut sind.
Das Basis-Bauelement, auf dem alle anderen Teile verbaut werden, ist die
Platine.
### Wie man richtig lötet
[Disclaimer]: Auch andere Läden haben Lötkolben oder andere Werkzeuge / Bauelementeund die von uns angegebenen Links sind keinesfalls die besten oder billigsten Teile. Die Links sollen Euch lediglich in die ungefähre Richtung schicken.

BIN
doc/packliste.odt Normal file

Binary file not shown.

BIN
doc/pentabug-anleitung.indd Normal file

Binary file not shown.

BIN
doc/pentabug-anleitung.pdf Normal file

Binary file not shown.

View File

@ -1,4 +1,4 @@
APPS = buggy jumpy mariotheme geiger ducklings wuerfel blinker APPS = buggy jumpy mariotheme geiger ducklings blinker
PROJECT=pentabug PROJECT=pentabug
@ -77,6 +77,8 @@ fljohn: $(PROJECT).hex Makefile
flsmart: $(PROJECT).hex Makefile flsmart: $(PROJECT).hex Makefile
$(AVRDUDE) -p m88 -F -P /dev/ttyUSB0 -c stk500v2 -v -v -U flash:w:$(PROJECT).hex $(AVRDUDE) -p m88 -F -P /dev/ttyUSB0 -c stk500v2 -v -v -U flash:w:$(PROJECT).hex
flusbasp: $(PROJECT).hex Makefile
$(AVRDUDE) -p m88 -F -c usbasp -v -v -U flash:w:$(PROJECT).hex
.PHONY : clean all fuse flash fljohn .PHONY : clean all fuse flash fljohn

View File

@ -7,6 +7,8 @@
#include <pentabug/music.h> #include <pentabug/music.h>
#include <pentabug/helper.h> #include <pentabug/helper.h>
#define BASELINE 0xa0
inline uint16_t biased_random(uint8_t value) { inline uint16_t biased_random(uint8_t value) {
return value / 2 * (rand() & 15); return value / 2 * (rand() & 15);
} }
@ -79,12 +81,12 @@ static void run(void) {
pentatonic_all_led_set(light >> 3); pentatonic_all_led_set(light >> 3);
motor_set(biased_random(light) > 0x70); motor_set(biased_random(light) > BASELINE + 0x40);
led_set(RIGHT, biased_random(light) > 0x30); led_set(RIGHT, biased_random(light) > BASELINE + 0x00);
led_set(LEFT, biased_random(light) > 0x30); led_set(LEFT, biased_random(light) > BASELINE + 0x00);
if(biased_random(light) > 0x60) { if(biased_random(light) > BASELINE + 0x20) {
uint16_t tone = (biased_random(light) * 2) + 500; uint16_t tone = (biased_random(light) * 2) + 500;
set_note(tone, 0); set_note(tone, 0);
} else { } else {

View File

@ -10,5 +10,6 @@ void matrix_show(void);
void matrix_init(void); void matrix_init(void);
void matrix_set(uint8_t x, uint8_t y, uint8_t active); void matrix_set(uint8_t x, uint8_t y, uint8_t active);
void matrix_brightness(uint8_t x, uint8_t y, uint8_t brightness);
#endif /* MATRIX_H */ #endif /* MATRIX_H */

View File

@ -3,8 +3,9 @@
#include <pentabug/timer.h> #include <pentabug/timer.h>
#include <pentabug/hal.h> #include <pentabug/hal.h>
static uint8_t pixels[9]; static uint8_t pixels[9] = {0};
static uint8_t index; static uint8_t index;
static uint8_t cycle;
void matrix_init(void) { void matrix_init(void) {
DDRD |= (1 << 5) | (1 << 6) | (1 << 7); DDRD |= (1 << 5) | (1 << 6) | (1 << 7);
@ -17,19 +18,19 @@ static void move_line(uint8_t line) {
PORTD &= ~(1 << (line + 5)); PORTD &= ~(1 << (line + 5));
} }
static void write_line(uint8_t data[]) { static void write_line(uint8_t data[], uint8_t timing) {
PORTC &= ~((1 << 5) | (1 << 4)); PORTC &= ~((1 << 5) | (1 << 4));
PORTB &= ~(1 << 2); PORTB &= ~(1 << 2);
if(data[0]) { if(data[0] > timing) {
PORTC |= 1 << 5; PORTC |= 1 << 5;
} }
if(data[1]) { if(data[1] > timing) {
PORTC |= 1 << 4; PORTC |= 1 << 4;
} }
if(data[2]) { if(data[2] > timing) {
PORTB |= 1 << 2; PORTB |= 1 << 2;
} }
} }
@ -38,16 +39,17 @@ static void matrix_int(void) {
++index; ++index;
if(index >= 3) { if(index >= 3) {
++cycle;
index = 0; index = 0;
} }
move_line(index); move_line(index);
write_line(pixels + (index * 3)); write_line(pixels + (index * 3), cycle & 3);
} }
void matrix_start(void) { void matrix_start(void) {
matrix_init(); matrix_init();
start_timer(PRESCALE_64, 125, matrix_int); start_timer(PRESCALE_64, 32, matrix_int);
} }
void matrix_stop(void) { void matrix_stop(void) {
@ -55,16 +57,22 @@ void matrix_stop(void) {
} }
void matrix_show(void) { void matrix_show(void) {
uint8_t i; for(uint8_t n = 0; n < 4; ++n) {
uint8_t i;
for(i = 0; i < 3; ++i) { for(i = 0; i < 3; ++i) {
move_line(i); move_line(i);
write_line(pixels + (i * 3)); write_line(pixels + (i * 3), n);
wait_ms(3); wait_ms(1);
}
} }
} }
void matrix_set(uint8_t x, uint8_t y, uint8_t active) { void matrix_set(uint8_t x, uint8_t y, uint8_t active) {
pixels[x*3+y] = active; pixels[x*3+y] = active ? 4 : 0;
}
void matrix_brightness(uint8_t x, uint8_t y, uint8_t brightness) {
pixels[x*3+y] = brightness;
} }

View File

@ -31,7 +31,7 @@ uint8_t photons_measure(void) {
// wait for discharge // wait for discharge
wait_ms(1); wait_ms(5);
// set direction to input for measurement // set direction to input for measurement

View File

@ -69,15 +69,17 @@ fuse:
$(AVRDUDE) -p m88 -F -P /dev/ttyUSB0 -c stk500v2 -v -v -U $(FUSES) $(AVRDUDE) -p m88 -F -P /dev/ttyUSB0 -c stk500v2 -v -v -U $(FUSES)
#flash: $(PROJECT).hex Makefile flash: $(PROJECT).hex Makefile
# $(AVRDUDE) -p m88 -F -c usbtiny -v -v -U flash:w:$(PROJECT).hex # $(AVRDUDE) -p m88 -F -c usbtiny -v -v -U flash:w:$(PROJECT).hex
$(AVRDUDE) -p m88 -F -P /dev/ttyUSB0 -c stk500v2 -v -v -U flash:w:$(PROJECT).hex
fljohflsmart: $(PROJECT).hex Makefile fljohflsmart: $(PROJECT).hex Makefile
$(AVRDUDE) -p m88 -F -P /dev/ttyUSB0 -c stk500v2 -v -v -U flash:w:$(PROJECT).hexn: $(PROJECT).hex Makefile $(AVRDUDE) -p m88 -F -P /dev/ttyUSB0 -c stk500v2 -v -v -U flash:w:$(PROJECT).hexn: $(PROJECT).hex Makefile
$(AVRDUDE) -p m88 -F -P /dev/serial/by-id/usb-FTDI_USB__-__Serial-if00-port0 -c stk500v2 -v -v -U flash:w:$(PROJECT).hex $(AVRDUDE) -p m88 -F -P /dev/serial/by-id/usb-FTDI_USB__-__Serial-if00-port0 -c stk500v2 -v -v -U flash:w:$(PROJECT).hex
flash: $(PROJECT).hex Makefile #flash: $(PROJECT).hex Makefile
$(AVRDUDE) -p m88 -F -P /dev/ttyUSB0 -c stk500v2 -v -v -U flash:w:$(PROJECT).hex # $(AVRDUDE) -p m88 -F -P /dev/ttyUSB0 -c stk500v2 -v -v -U flash:w:$(PROJECT).hex
.PHONY : clean all fuse flash fljohn .PHONY : clean all fuse flash fljohn

View File

@ -1,19 +1,13 @@
# Test firmware # Test firmware
Use this firmware to test all hardware components of a Pentabug. It can test Use this firmware to test all hardware components of a Pentabug. It can test
nearly all hardware features of the device. nearly all hardware features of the device. It offers the following features:
The following things exist in all modes: * the left led blinks when no input is present
* receiving an IR signal activates the right led
* right LED is on when IR signals are received (use a remote or first mode to * pressing the left button sends an IR signal (triggering the right led)
test) * pressing the right button activates the motor
* pressing the right button activates next mode, plays a sound using BUZZR * each button plays a sound using a different pin of the buzzer
* the pins of the extension board are constantly cycled through (add a
Here is a description what happens on a right button press in which mode: pentatonic to visualize all but one pin)
* activate left LED and send IR signal
* activates motor
* plays sound using BUZZGND
* activates all pins on the extension board for a short time (add a penetatonic
to get feedback on all but one of those pins)

View File

@ -12,35 +12,14 @@
#define FLASH(port, pin) { port &= ~(1 << pin); _delay_ms(50); port |= 1 << pin;} #define FLASH(port, pin) { port &= ~(1 << pin); _delay_ms(50); port |= 1 << pin;}
static volatile uint32_t button_state = 0;
static volatile uint8_t next_mode = 0;
static volatile uint8_t ir_active = 0; static volatile uint8_t ir_active = 0;
enum test_modes {
PHOTONS,
MOTOR,
AUDIO,
SHIELD,
// the end ... wrap
MODE_MAX,
};
ISR(TIMER0_COMPA_vect) { ISR(TIMER0_COMPA_vect) {
if(ir_active) { if(ir_active) {
PORTD ^= 1 << 2; PORTD ^= 1 << 2;
} else { } else {
PORTD &= ~(1 << 2); PORTD &= ~(1 << 2);
} }
if(PINB & (1 << 1)) {
button_state = 0;
} else {
++button_state;
}
if(button_state == (38l * 1000 / 2)) {
next_mode = 1;
}
} }
static void reset_hw(void) { static void reset_hw(void) {
@ -70,7 +49,6 @@ static void reset_hw(void) {
} }
int main(void) { int main(void) {
uint8_t vib_delay = 0;
uint16_t count = 0; uint16_t count = 0;
// we need to get real fast (8MHz) to handle 38kHz IR frequency ... // we need to get real fast (8MHz) to handle 38kHz IR frequency ...
@ -96,79 +74,54 @@ int main(void) {
// looping // looping
enum test_modes mode = PHOTONS;
for ever { for ever {
// next mode? // blinking left led
if(next_mode) { if(count % 0x4000 == 0) {
// cleanup PORTD ^= 1 << 4;
switch(mode) {
case PHOTONS:
ir_active = 0;
break;
case MOTOR:
case AUDIO:
case SHIELD:
break;
case MODE_MAX: break;
}
reset_hw();
++mode;
if(mode == MODE_MAX) {
mode = 0;
}
uint32_t i;
for(i = 0; i < 50; ++i) {
PORTB ^= 1 << 7;
_delay_ms(1);
}
next_mode = 0;
} }
uint8_t button = !(PINB & (1 << 0)); ++count;
// right led on ir
not_follow(PIND & (1 << 3), PORTC, 2); not_follow(PIND & (1 << 3), PORTC, 2);
switch(mode) { // left button
case PHOTONS:
{
ir_active = button;
if(count % 0x2000 == 0) {
PORTD ^= 1 << 4;
}
++count;
break;
}
case MOTOR:
not_follow(button, PORTB, 6);
break;
case AUDIO:
{
if(button) {
PORTC ^= 1 << 0;
_delay_ms(2);
}
break; const uint8_t button_r = !(PINB & (1 << 0));
} const uint8_t button_l = !(PINB & (1 << 1));
case SHIELD:
if(button) { // ir
FLASH(PORTB, 2);
FLASH(PORTD, 5); ir_active = button_r;
FLASH(PORTD, 6);
FLASH(PORTD, 7); // motor
FLASH(PORTC, 5);
FLASH(PORTC, 4); not_follow(button_l, PORTB, 6);
}
break; // sound stuff
case MODE_MAX: break;
if(button_l) {
PORTC ^= 1 << 0;
_delay_ms(2);
} }
if(button_r) {
PORTC ^= 1 << 0;
_delay_ms(4);
}
// cycle pins on extension board
const uint8_t step = (count >> 13) & 7;
follow(step == 0, PORTB, 2);
follow(step == 1, PORTD, 5);
follow(step == 2, PORTD, 6);
follow(step == 3, PORTD, 7);
follow(step == 4, PORTC, 5);
follow(step == 5, PORTC, 4);
} }
/* never return 0; */ /* never return 0; */

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

View File

Before

Width:  |  Height:  |  Size: 608 KiB

After

Width:  |  Height:  |  Size: 608 KiB