THAMES and KOSMOS 620141 Kosmobits / Code Gamer User Manual 1620141 KosmoBits Manual Cover indd
THAMES & KOSMOS, LLC. Kosmobits / Code Gamer 1620141 KosmoBits Manual Cover indd
Contents
- 1. Users Manual
- 2. Users Manual - German version
Users Manual - German version










































![ArraysWenn du viele Werte vom gleichen Typ speichern möch-test, zum Beispiel die letzten 100 Messwerte, wird es mit einfachen Variablen schnell unübersichtlich und aufwendig zu tippen. Du müsstest schließlich für jeden einzelnen Wert eine eigene Variable anlegen, also zum Beispiel:int wert1;int wert2;int wert3;...u s w...int wert 100;Viel einfacher ist es, stattdessen ein sogenanntes Array (gesprochen »Ärräj« mit weichem, englischem »r«) zu benutzen.In einem Array kannst du nämlich gleich mehrere Wer-te speichern. Damit du auf die verschiedenen Werte zu-greifen kannst, werden sie im Array durchnummeriert. Du kannst dir ein Array also als eine Art Tabelle vor-stellen, in der die einzelnen Werte in nummerierte Spal-ten eingetragen werden. Die Nummerierung der Spal-ten beginnt allerdings nicht mit 1, sondern mit 0:INDEX 0 1 2 3 … nWERTE Wert 0 Wert 1 Wert 2 Wert 3 …Wert nEin Array legst du allgemein folgendermaßen an:typ arrayName[länge];Du kannst einem Array auch gleich bei der Definition Werte zuweisen, indem du die einzelnen Werte in ge-schweiften Klammern angibst: Der Typ legt fest, welche Art von Daten in dem Array gespeichert werden können (int, float, usw.). Die Anzahl der Werte, die in einem Array gespeichert werden kön-nen, wird als Länge bezeichnet. int meinArray[10]; // Ein Array, das 10 // int Werte aufnehmen kannint meinArray[4] = {0, 4, 2, 3};In dem Fall brauchst du nicht unbedingt anzugeben, wie viele Werte es sind. Du kannst also auch so schreiben: int meinArray[] = {0, 4, 2, 3};Um also zum Beispiel ein Array anzulegen, das 10 Inte-gerwerte aufnehmen kann, gehst du so vor: WISSEN KOMPAKTEin Array wird im Deutschen manchmal auch Feld oder Datenfeld genannt. Allerdings ist die englische Bezeichnung auch im Deutschen sehr viel gängiger.KosmoBits](https://usermanual.wiki/THAMES-and-KOSMOS/620141.Users-Manual-German-version/User-Guide-3149688-Page-43.png)
![Häufig möchtest du, dass alle einzelnen Werte auf Null gesetzt werden. Das kannst du kurz so schreiben: int meinArray[10] = {}; // Array der // Länge 10. Alle Werte werden auf 0 // gesetzt.Um auf die einzelnen Werte eines Arrays zuzugreifen, gibst du in eckigen Klammern den Index des Wertes an, auf den du zugreifen möchtest. Wenn du dir das Array also als Tabelle vorstellst, entspricht der Index der Nummer der Spalte.int meinArray[100] = {}; // Array der // Länge 100; alle Werte 0.meinArray[2] = 42; // Der Wert an Index- // Position 2 ist jetzt 42.int x = meinArray[2]; // x erhält den in // meinArray an Index-Position 2// gespeicherten Wert, hier also 42.Häufig möchtest du aus den einzelnen Werten einen neuen berechnen, zum Beispiel die Summe aller Einzel-werte. Da du die einzelnen Werte über ihren Index an-sprechen kannst, geht das nun mit einer for-Schleife sehr einfach:// werte ist ein Array der Länge 100.int summe = 0;for (int index = 0; index < 100; ++index) { summe = summe + werte[index];}Beim ersten Durchlauf der Schleife wird der Wert werte[0] zu summe hinzu addiert. Danach wird index um 1 erhöht, und der nächste Wert addiert. Das wird solange wiederholt, bis der letzte Wert, also werte[99], addiert wurde. Im nächsten Projekt wirst du ein Array benutzen, um eine Tonleiter abzuspielen.!ACHTUNG!Da der Index für den ersten Wert nicht 1 ist, sondern 0, ist der höchstmögliche Index für ein Array der Länge N nicht N, sondern N - 1. Bei einem Array der Länge 100, wäre also der höchstmögliche Index 99. Benutzt du einen hö-heren Index, kommt es zu einem Fehler im Programmab-lauf: Was dann passiert lässt sich nicht vorhersagen. Achte also darauf, dass du nur gültige Werte für den In-dex benutzt.WISSEN KOMPAKT](https://usermanual.wiki/THAMES-and-KOSMOS/620141.Users-Manual-German-version/User-Guide-3149688-Page-44.png)
![</>TonleiterDU BRAUCHST › KosmoDuino im Interaction BoardDER PLANDein KosmoDuino spielt eine Tonleiter.DAS PROGRAMMZunächst bindest die Datei KosmoBits_Pins.h ein und definierst dir die Konstanten buzzerPin und freqGrundton . Schließlich legst du noch das Array tonleiter[] an, in dem die Frequenzverhältnisse der Töne einer Dur-Tonleiter abgelegt werden. Um die Fre-quenz eines Tones zu ermitteln, musst du den entsprechen-den Wert mit der Frequenz des Grundtones multiplizieren.#include <KosmoBits_Pins.h>const int buzzerPin = KOSMOBITS_BUZZER_PIN;const int freqGrundton = 220; // Das ist der // Ton A (eine Oktave tiefer als der Kammer- // ton A aus Projekt 10).float tonleiter[] = {1.f, 9.f/8, 5.f/4, 4.f/3, 3.f/2, 5.f/3, 1 5.f/8, 2.f};void setup() { for (int i = 0; i < 8; ++i) { tone(buzzerPin, tonleiter[i] * freqGrundton); delay(500); } noTone(buzzerPin);}void loop() { // Hier wird nichts gemacht.}Diesmal passiert alles bereits in s e tu p () . In der for - Schleife wird die Variable i von 0 bis 7 hochgezählt. Für jeden Wert von i wird dann mit tone(buzzerPin, tonleiter[i] * freqGrundton); der i-te Ton der Tonleiter ausgegeben. Wie oben bereits be-schrieben, wird zur Ermittlung der richtigen Frequenz die Frequenz des Grundtons freqGrundton mit dem entspre-chenden Frequenzverhältnis to nleiter[i] multipliziert.Nach einer Pause wird die for -Schleife erneut durchlau-fen, bis der höchste Ton der Tonleiter erreicht wurde. Da-nach ist Stille: noTone(buzzerPin);In der Hauptschleife wird diesmal nichts gemacht. Die Tonleiter wird also nur ein einziges Mal abgespielt. Um die Tonleiter nochmal abzuspielen, kannst du die Reset-Taste auf dem KosmoDuino drücken. Dadurch wird der Code zu-rückgesetzt und von Neuem ausgeführt.PROJEKT 13KosmoBits](https://usermanual.wiki/THAMES-and-KOSMOS/620141.Users-Manual-German-version/User-Guide-3149688-Page-45.png)
![Sensor-OrgelNachdem du nun gelernt hast, wie man Tonleitern spielt, kannst du in diesem Projekt ein richtiges Musikinstrument programmieren.DU BRAUCHST › KosmoDuino im Interaction Board› Bewegungssensor#include <KosmoBits_Pins.h>const int sensorPin = KOSMOBITS_SENSOR_PIN;const int buzzerPin = KOSMOBITS_BUZZER_PIN;const int tasterPin = KOSMOBITS_TASTE_2_PIN;const float tonleiter[] = {1.f, 9.f/8, 5.f/4, 4.f/3, 3.f/2, 5.f/3, 15.f/8, 2.f};const int freqGrundton = 220; // Das ist der // Ton A.const int messwertMin = 300;const int messwertMax = 400;const int skalierung = (messwertMax - messwert Min) / 9;const int N = 10; // Anzahl der Werte, die // gemittelt werden.int werte[N] = {}; // Hier werden die letzten // 10 Werte gespeichert.int index = 0;Hier werden nur die jeweiligen Pin-Modi eingestellt. void setup() { pinMode(sensorPin, INPUT); pinMode(tasterPin, INPUT);}void loop() { // Lese einen neuen Wert vom Sensor und // speichere ihn in werte[]. werte[index] = analogRead(sensorPin);Zunächst definierst du ein paar Konstanten für Sensor-, Buzzer- und Taster-Pin. Danach legst du wie im vorigen Projekt ein Array für die Tonleiter, sowie eine Konstante für den Grundton, an. Mit den Konstanten messwertMin und messwertMax stellst du ein, wie weit der Controller gekippt werden muss, um den höchsten bzw. den tiefsten Ton zu spielen. Du kannst diese Werte später für dich anpassen. Die Kon stante skalierung benutzt du später, um aus einem Messwert die Tonhöhe zu bestimmen. Du teilst damit quasi den gesamten Messbereich in 9 Bereiche ein. Der Bewegungssensor ist recht empfindlich. Deshalb schwanken die Messwerte ein wenig. Damit die Tonhöhe dadurch nicht zu wackelig wird, nimmst du nicht direkt den letzten Messwert, um daraus die Tonhöhe zu berech-nen, sondern bestimmst den Mittelwert von 10 Messungen. Die letzten 10 Messwerte werden dazu in dem Array w e rt e[] gespeichert. Durch int werte[N] = {}; werden alle Werte darin zunächst auf 0 gesetzt. Mit der Variablen index wird das Array durchlaufen. Gestartet wird wie üblich bei 0.DER PLANPer Tastendruck erzeugst du Töne. Die Tonhöhe kannst du verändern, indem du das Interaction Board bewegst. Mit ein wenig Übung kannst du so richtige Melodien spielen.</>DAS PROGRAMMZunächst liest du einen neuen Messwert und speicherst ihn im Array werte an Index-Position index . Damit der nächste Messwert an der darauffolgenden Position gespei-chert wird, wird mit ++index; die Variable index um 1 erhöht. Wird dabei der Wert N erreicht, stellt die PROJEKT 14](https://usermanual.wiki/THAMES-and-KOSMOS/620141.Users-Manual-German-version/User-Guide-3149688-Page-46.png)
![Zugegeben: Das war schon etwas umfangreicher. Das Ergebnis lohnt sich aber! // Erhöhe den Index um 1, damit der nächste // Wert an der nächsten Stelle // im Feld werte[] gespeichert werden kann. ++index; // Wenn index == N ist, ist das Feld voll // beschrieben. // index wird dann auf 0 gesetzt, damit im // nächsten Durchlauf // der älteste Wert überschrieben wird. if (index == N) { index = 0; } // Jetzt wird der Mittelwert der letzten N // Messwerte berechnet. int mittelwert = 0; // Starte mit dem Wert 0 // Summiere die letzten 10 gemessenen Werte. for (int i = 0; i < N; ++i) { mittelwert = mittelwert + werte[i]; } // Teile die Summe durch die Zahl der Werte. mittelwert = mittelwert / N; int tonIndex = (mittelwert - messwertMin) / skalierung; // tonIndex darf nicht kleiner 0 und nicht // größer 7 sein: if (tonIndex < 0) { tonIndex = 0; } else if (tonIndex > 7) { tonIndex = 7; } // Ton ausgeben if (digitalRead(tasterPin) == LOW) { tone(buzzerPin, tonleiter[tonIndex] * freq-Grundton); delay(10); } else { noTone(buzzerPin); delay(1); }}</>if -Anweisung index auf 0 zurück. Das Array wird wie-der von vorne befüllt. Danach geht es daran, den Mittelwert der letzten 10 Mess-werte zu bestimmen. Dazu wird die Variable mittelwert zunächst auf 0 gesetzt. In der for -Schleife werden dann alle im Array w e rte[] gespeicherten Messwerte zu mittelwert hinzu addiert. Um daraus dann den Mittel-wert zu bestimmen, muss das Ergebnis noch durch die Zahl der Werte geteilt werden: mittelwert = mittelwert / N; . Mit int tonIndex = (mittelwert - messwertMin) / skalierung; ermittelst du den »Tonindex«: Der wievielte Ton der Tonlei-ter soll gespielt werden? Es kann sein, dass tonIndex einen ungültigen Wert hat, also kleiner als 0 oder größer als 7 ist. Deshalb korrigierst du das im Zweifelsfall mit der if-else -Anweisung. Schließlich wird in der letzten if -Abfrage getestet, ob der Taster gedrückt ist. Wenn ja, wird der entsprechende Ton ausgegeben. Wenn nicht, wird kein Ton ausgegeben.KosmoBitsPROJEKT 14](https://usermanual.wiki/THAMES-and-KOSMOS/620141.Users-Manual-German-version/User-Guide-3149688-Page-47.png)

















![Vermutlich hast du vergessen, den seriellen Monitor zu schließen, bevor du dein Programm hochladen wolltest.1. Du hast vergessen, den KosmoDuino mit dem Computer zu verbinden. Vielleicht hast du das USB-Kabel auch nur versehentlich in die Ladebuchse des Interaction Boards gesteckt.2. Es ist der falsche Port eingestellt. Überprüfe das im Menü »Werkzeuge ➜ Port« und ändere den Port gegebenenfalls.avrdude: ser_open(): can't open device "\\.\COM4": Zugriff verweigertavrdude: ser_open(): can't open device "\\.\COM4": Das System kann die angegebene Datei nicht finden.Wenig Arbeitsspeicher verfügbar, es können Stabilitätsprobleme auftreten.BEISPIEL:int array[1000] = {}; // Das ist zu groß!LÖSUNG:LÖSUNG:LÖSUNG:LÖSUNG:Ändere dein Programm so, dass du mit einem kleineren Array auskommst.Schließe den seriellen Monitor und lade das Programm erneut hoch.Verwende das USB-Kabel um deinen Computer mit dem USB-Port am KosmoDuino zu verbinden.Wähle einen anderen Port aus.Dein Programm füllt fast den gesamten Arbeitsspeicher des Mikrocontrollers oder ist sogar schon zu groß dafür. Vermutlich hast du ein ziemlich großes Array angelegt.Nicht genug ArbeitsspeicherKosmoBits](https://usermanual.wiki/THAMES-and-KOSMOS/620141.Users-Manual-German-version/User-Guide-3149688-Page-65.png)


![0718020 SO 300416ÜBERSICHT ÜBER EINIGE WICHTIGE BEFEHLE PROGRAMMSTRUKTUR ERKLÄRUNGvoid setup(){ }Initialisierung. Am Anfang jedes Programms können erste Ein-stellungen vorgenommen werden, das sogenannte »setup«. Hier wird zum Beispiel festlegt, welche Pins welche Funktion über-nehmen sollen oder wo die LEDs angeschlossen sind. Das setup wird nach jedem Start oder Neustart nur einmal durchgeführt.void loop(){ }Hauptschleife. Der Hauptteil des Programms ist der sogenannte Loop. Es ist eine Schleife, die sich solange wiederholt, wie der Mi-crocontroller läuft. Hier sind alle wichtigen Funktionen unterge-bracht, die dauerhaft das System überwachen oder verändern.VARIABLEN BEISPIELint (ganze Zahlen) int led = 13;long (lange ganze Zahlen) long meinWert = 111111;float (Fließkommazahlen) float meinWert = 2.5;char (Alphanumerische Zeichen: Buchstaben, Zahlen, Sonderzeichen) char meinBuchstabe = ´a´;array (Variablenfeld) int meineWerte[4] = {12, 18, 23, 86}BEFEHL BEISPIEL ERKLÄRUNGp i n M o d e () pinMode(led, OUTPUT); Setzt den Pin mit dem Namen »led« als Aus-gabe-Pin fest.digitalWrite() digitalWrite(led, HIGH);Legt einen Strom auf dem Pin mit dem Namen »led« an.d i gi t al R e a d () digitalRead(Schalter) Liest den Zustand von Pin »Schalter« aus: Ist der Schalter an (HIGH) oder aus (LOW)?a n al o g W rit e() analog Write(le d, 255) Setzt den Pin mit dem Namen »led« auf den Wert 255analogRead() a nalog Re ad(te m p) Liest den Wert, den der Pin mit dem Namen »temp« liefert.d el a y () delay(1000); Lässt das Programm eine Sekunde warten (=1000 Millisekunden).S e r i al.b e g i n () Serial.begin(115200) Beginnt die Übertragung von Daten zum PC mit 115200 Baud (Symbolen pro Sekunde)Serial.println() Serial.println(„Hallo“); Zeigt im seriellen Monitor »Hallo« an.› › › KosmoBits Quickstart-Guide](https://usermanual.wiki/THAMES-and-KOSMOS/620141.Users-Manual-German-version/User-Guide-3149688-Page-68.png)