ITTT Gitaar Tablature Printer, Pluis Dikstaal
82 Views, 0 Favorites, 0 Comments
ITTT Gitaar Tablature Printer, Pluis Dikstaal
Voor mijn ITTT (If This Than That) project heb ik een gitaar tablature print gemaakt. De muzikant kan de noten zelf noteren en op deze manier het geschreven nummer vastleggen. De tablature wordt tijdens het printen gelijk opgerold zodat deze overzichtelijk opgeborgen kan worden. Ik speel zelf gitaar en merk dat mijn eigen verzonnen melodietjes mijn herinneringen snel ontvluchten. Er staan ontelbare gitaarspinsels op mijn telefoon zonder notaties. Daarom wilde ik graag iets maken om al mijn nummers te kunnen noteren en dus terug te kunnen spelen. Dit ontwerp is vele veranderingen ondergaan voordat ik uitkwam op dit eindresultaat. Ik heb nog nooit eerder met Arduino gemaakt, maar ik vond het erg interessant en leerzaam om te doen. Het spelen en testen met Arduino heeft mij inspiratie gegeven. Ook heeft het mij meer inzicht gegeven in de oneindig veel mogelijkheden die je hiermee kan maken.
Supplies
- 1x Arduino UNO
- 1x Thermal Printer
- 1x Tower Pro Micro Servo SG90 (360˚)
- 1x Printplaat
- 1x Led
- 1x LDR weerstand
- 2x pushbuttons
- 1x weerstand 220Ω
- 3x weerstand 10kΩ
- Draden
- Soldeer tin
- Voeding adapter 5-9V
- Cilinder vorming voorwerp (diameter +-1,5 cm)
- Kistje
- Hout (muurplankje Xenos)
- Houtlijm
- Tape
- 2x punaise (knopjes)
Optioneel
- Beits
Concept 1, Melodie Naar Tab
Vanaf het begin van het project leek het mij leuk om iets met muziek te doen. Daar heb ik immers een passie voor. Wellicht dat ik een instrument kom maken die bespeeld word door gebruik van bewegingscensoren. Echter bestaat dit instrument al (een theremin) en ik wilde toch proberen iets originelers te maken.
Vervolgens kwam ik op het idee om een apparaatje te maken die de gespeelde gitaar noten kan herkenen en deze vervolgens om kan schrijven naar gitaar tablature. Zoals ik eerder heb vermeld ben ik niet secuur in het vastleggen van melodietjes en verdwalen deze na een tijdje in mijn hoofd waar ik niet meer bij kan. Daarbij zou het super handig en efficient zijn als ik kon spelen en dat dit gelijk om zou worden gezet naar tablature. Nou zijn tablatures niet per definitie iets fysieks. Dus printen maar! Zo kwam ik op het concept om mijn gitaar noten te laten herkennen door middel van een gelinkte microfoon. Deze noten moesten dan vervolgens worden omgeschreven naar de juiste positie op de fredboard van een gitaar zodat de tablature berekent kan worden en uiteindelijk uitgeprint kan worden. Denkende aan het formaat van gitarTabs kwam een bonnenprintertje al snel in mij op. Op deze manier kan je ook zo lang door printen als dat je binnenpapier hebt. Perfect voor gitarTabs.
Echter na onderzoek te hebben gedaan naar eventuele noot-herkenning-programa's en melodie naar Tab-convertors kwam ik er al snel achter dat dit erg lastig ging worden met zo weinig ervaring in dit vak gebied. Ook waren de meeste programma's redelijk prijzig. Ik had dit concept nog niet opgegeven, maar ik ging toch maar eerst een poging doen om een bonnenprinter een gitaar tablature te laten printen. Dit was ook nog een grotere uitdaging dan gedacht.
Concept 2, Tablature Maker
Terwijl ik aan het stoeien was om de code zo te krijgen dat de printer een redelijk overzichtelijke tablature kon printen, was ik aan het malen hoe ik dit project verder uit ging werken. Ik kwam op het idee om een soort oude telefoon constructie te gebruiken met knoopjes oplopend van 0-9 in een raster en een verticale rij met 6 knopjes die de snaren moesten representeren. Het idee was om eerst op een van de 6 knopjes te drukken voor de desbetreffende snaar (E A D G B E) en vervolgens aan te geven op welke fred (toonhoogte) deze gespeeld moest worden door de andere knopjes te gebruiken. Ik kwam er al snel achter dat het dan wel zo overzichtelijk zou zijn om te zien om je het juiste had ingetoetst. Even kwam het idee langs om dit met lichtjes aan te geven, maar dit zou betekenen dat ik 16 knopjes en lichtjes nodig zou hebben. Of, wellicht veel simpeler maar ook intimiderende voor een beginneling, een schermpje. Ik kreeg mijzelf niet over de drempel om hier gemotiveerd over te raken aangezien ik niet het gevoel kreeg alsof dit mij ging lukken en dat vond ik zonde. Ik wilde liever iets kleiners maken waar ik meer tijd voor kon nemen en gemotiveerd zijn dan mijzelf verdrinken in knopjes en lichtjes.
Concept 3, Tablature Klok
Dit idee is een verbastering op het 2e concept wat ik had, alleen dan nog net wat ingewikkelder en onoverzichtelijker maar het zou er wel cool uitzien. Het idee was om in plaats van knopjes een soort klok te maken. De ene wijzer zou staan voor de snaren en zou naar 1 tot en met 6 kunnen wijzen (ofwel E A D G B E). De andere wijzer zou staan voor de plaatsing van de vinger op de nek van de gitaar (het fret nummer). Door een servo met servo continuous rotation, een draaicirkel van 360˚, te verbinden met een knopje zou ik een wijzer draaiende kunnen maken, maar ik moest twee wijzers hebben. Hiervoor zou ik een constructie kunnen maken met tandwielen alleen leek mij dit ook weer erg ingewikkeld voor een design dat niet erg duidelijk is voor buitenstanders. Dit idee heb ik dan ook weer losgelaten en ik wilde proberen mijzelf in een wat simpelere gedachtestroom te krijgen.
Eindconcept +
Het idee om tablature te printen stond vast. De code voor het printen begon ergens op te lijken alleen de cijfers stonden nog niet goed. Nu dacht ik, hoe handig zou het zijn als het bonnetje automatisch zo worden opgerold terwijl de printer print. Daarbij kan ik een stukje er tussen maken dat je de tablature gelijk kan meespelen terwijl deze geprint en gerold wordt. Toen kwam ik op deze constructie. Met het gebruik van een Servo continuous rotation en knopjes, kon ik het bonnetje op de snelheid van de printer laten oprollen.
Het direct printen van de cijfers in de tablature was nog wel een uitdaging. De gebruiker van het apparaatje zou zijn laptop eraan moeten verbinden en in de code zijn tablature moeten invullen. Dit vond ik onhandig. Daarom heb ik er voor gekozen om een langer stukje hout aan het doosje met de printer te maken waarop de muzikant zelf op het bonnetje kan schrijven. Dit heeft min of meer hetzelfde effect en vergroot het gebruiksgemak.
Om nog iets extra's toe te voegen, kwam ik op het idee om een leeslampje aan te sluiten. Daarbij vond ik het leuk en handig als het lampje vanzelf aan zou gaan als het te donker wordt. Hiervoor heb ik een LDR-weerstandje gebruikt. Deze heb ik onder het schrijfplankje bevestigd met extra ruimte zodat de schaduw het weerstandje niet beïnvloed, maar dat deze wel de lichtinval van de omgeving kan lezen.
Onderdelen
Voor mijn project heb ik een Servo continuous rotation moeten aanschaffen. Dit is een servo die in plaats van 180˚ draait, 360˚ kan draaien. Ik heb de Tower Pro Micro Servo 9g SG90 besteld en deze werkte perfect voor mijn project. Dit was essentieel voor mijn project aangezien ik een bonnetje wilde oprollen. Verder heb ik meerdere printplaatjes besteld zodat ik het kon veroorloven eentje de vernageling in te werken. Dit is gelukkig niet gebeurt.
Aansluiting
Hieronder de verbindingen waaruit mijn circuit bestaat:
GND > led anode, led kathode (+) > weerstand 220Ω > pin 13;
GND > LDR, LDR > pin A0, LDR > weerstand 10kΩ > 5V;
GND > weerstand 10kΩ > pushbutton > pin 7 (pin 4 voor tweede button), pushbutton > 5V;
Bruine draad Servo > GND Arduino, rode draad Servo > 5V Arduino, gele draad Arduino > pin 3;
GND thermal printer > GND Arduino, RX thermal printer > TX Arduino.
De thermal printer moet ook worden aangesloten op een stopcontact aangezien de Arduino niet genoeg stroom kan leveren voor het printen.
Solderen
Het printplaatje heeft exact dezelfde verbindingen als het breadboard. Deze zijn alleen net anders gepositioneerd voor mijn eindwerk. Voor dat ik begon met het daadwerkelijke solderen heb ik eerst alle onderdelen op het printplaatje geplaatst, hiervan een foto gemaak en vervolgens de verbindingen uitgetekend. Het LDR weerstandje heb ik onder het printplaatje bevestigd zodat deze het licht van de omgeving kan opvangen zonder direct in visie te vallen van de gebruiken van het apparaat.
Het solderen zelf vond ik behoorlijk lastig. Het was de eerste keer dat ik het deed en ik had een tegenvaller met de soldeerbout. Ik had al behoorlijk wat gesoldeerd tot ik tot de conclusie kwam dat mijn soldeerbout veel te koud was. Hierdoor zijn de tin bolletjes te groot geworden en ziet het er naar mijn mening een beetje slordig uit. In de reflectie vertel ik hier nog iets meer over.
Omhulsing
Voor de omhulling ben ik eerst opzoek gegaan naar een doosje waar de printer in zou passen. Ik ben tegen een sieraden doosje aangelopen waarvan ik dacht deze te kunnen gebruiken na een boel aanpassingen.
Afmetingen:
Doosje:
- Breedte: 15cm
- Lengte: 15cm
- Hoogte; 10cm
Schrijfplank:
- Breedte: 10cm
- Lengte: 25cm
- Hoogte; 5,5cm
Het doosje heb ik helemaal omgebouwd en het laatje en de 2e verdieping eruit gehaald. De bekleding heb ik ook verwijderd en glad geschuurd. Het muurplakje wilde ik graag recht hebben en dus heb ik de pootjes bij gezaagd tot een hoogte van 5,5cm. Op 5,7cm gemeten vanaf de onderkant van het doosje heb ik een gleuf geboord en geveild van 7cm lang en ongeveer 0,5cm hoog. Hierdoor loopt het bonnetje. Deze loopt over de hele lengte van het plankje waarbij deze via een gleuf onder het plankje verschuift en hier wordt opgerold. De servo is bevestigd aan de zijkant van de plank op 2,3cm gemeten van onder. Deze is vastgezet met een schroefje.
In het schrijfplankje zitten 3 gaatjes. Het gat voor het led lampje zit om 12,5cm (het midden) van het plankje en heeft een diameter van 0,7cm. Vanaf het midden gemeten zit 2cm het volgende gaatje met een diameter van 0,5cm. Weer een centimeter verder zit het laatste gaat voor het 2e knopje (⌀0,5). De printplaat is aan de onderkant bevestigd met tape en twee schroefjes om hem op zijn plek te houden.
Voor de bedrading zitten er 2 gaatjes onder de plank die het doosje in gaan. Ze hebben beide een diameter van ongeveer 1cm. Ik heb gekozen voor 2 gaten zodat ik iets meer overzicht kon houden in de bedrading. In het doosje zelf zit achterop nog een gat met een diameter van 1,3cm. Deze is voor de usb-kabel naar de laptop. Als laatst zit er nog een kleine uitsparing tussen de bovenkant van het doosje en de deksel. Deze is voeding van de thermal printer.
Als laats is het cilindervormige object (in mijn geval heb ik de plastic binnenrol van een binnenrol gebruik) bevestigd op de servo met behulp van tape. Ik heb het symmetrische opzet stukje gebruikt die bij de servo kwam en deze bij gesneden zodat ik de servo dicht aan het plankje kon bevestigen.
Binnenkant
In de binnenkant van het doosje zit de printer en de Arduino. De printer zit vast aan de bodem met tape. Het printplaatje bevindt zich aan de onderkant van plankje zodat het lichtje zichtbaar is en de knopjes functioneel.
Code
#include "Adafruit_Thermal.h"
#include <Servo.h>
const int ledPin = 13;
const int ldrPin = A0;
const int buttonPin = 4;
const int button2Pin = 7;
const int servoPin = 3;
Servo Servo1;
int currentServoPosition = 0; // Start at 0 degrees
const int STOPPED = 1500;
bool isPrinting = false;
bool isSpinning = false;
bool button1Pressed = false;
bool button2Pressed = false;
Adafruit_Thermal printer(&Serial);
void printTabLines(String tabLines[5]);
void printTabLinesSINGLES(String tabLines[1]);
void updateTabLines(String tabLines[5], int fretNumbers[5]);
void setVerticalPrintingMode();
void setHorizontalPrintingMode();
void adjustServoPosition(int targetPosition);
String tabLines[5] = {
"- - - - - -",
"- - - - - -",
"- - - - - -",
"- - - - - -",
"- - - - - -",
};
String tabLinesLINES[1] = {
"| | | | | |",
};
void setup() {
Serial.begin(9600); // Initialize Serial communication
Servo1.attach(servoPin);
printer.begin();
pinMode(ledPin, OUTPUT);
pinMode(ldrPin, INPUT);
pinMode(buttonPin, INPUT);
pinMode(button2Pin, INPUT);
setVerticalPrintingMode();
printer.println();
}
void loop() {
int ldrStatus = analogRead(ldrPin);
if (ldrStatus <= 300) {
digitalWrite(ledPin, LOW);
} else {
digitalWrite(ledPin, HIGH);
}
int buttonState = digitalRead(buttonPin);
int button2State = digitalRead(button2Pin);
if (buttonState == HIGH && button2State == HIGH) {
isPrinting = true;
isSpinning = false;
performPrintOnlyAction();
}
if (buttonState == HIGH && button2State == LOW) {
if (!button1Pressed) {
button1Pressed = true;
isPrinting = true;
isSpinning = false;
performButton1Action();
}
} else {
button1Pressed = false;
isPrinting = false;
}
if (button2State == HIGH && buttonState == LOW) {
button2Pressed = true;
isPrinting = false;
isSpinning = true;
performButton2Action();
} else {
button2Pressed = false;
isSpinning = false;
Servo1.writeMicroseconds(STOPPED);
}
if (Serial.available()) {
String input = Serial.readStringUntil('\n');
input.trim();
if (input.equalsIgnoreCase("STOP")) {
isPrinting = false;
isSpinning = false;
}
}
if (!isPrinting && !isSpinning) {
Servo1.writeMicroseconds(STOPPED);
}
}
void printTabLines(String tabLines[5]) {
for (int i = 0; i < 5; i++) {
setVerticalPrintingMode();
printer.println(tabLines[i]);
}
}
void printTabLinesSINGLES(String tabLines[1]) {
for (int i = 0; i < 1; i++) {
printer.println(tabLines[i]);
}
}
void adjustServoPosition(int targetPosition) {
int stepSize = 1; // Smaller steps for smoother movement
while (currentServoPosition != targetPosition) {
if (currentServoPosition < targetPosition) {
currentServoPosition += stepSize;
if (currentServoPosition > targetPosition) {
currentServoPosition = targetPosition;
}
} else if (currentServoPosition > targetPosition) {
currentServoPosition -= stepSize;
if (currentServoPosition < targetPosition) {
currentServoPosition = targetPosition;
}
}
int microseconds = map(currentServoPosition, 0, 360, 1000, 2000);
Servo1.writeMicroseconds(microseconds);
// Delay to control the speed of the movement
delay(20); // Adjust this delay to make the servo move slower
}
}
void performButton1Action() {
printTabLines(tabLines);
printTabLinesSINGLES(tabLinesLINES);
adjustServoPosition(currentServoPosition - 15); // Adjust the servo position after printing
}
void performButton2Action() {
Servo1.write(82); // Rotate continuously
}
void performPrintOnlyAction() {
printTabLines(tabLines);
printTabLinesSINGLES(tabLinesLINES);
}
void setVerticalPrintingMode() {
printer.write(27);
printer.write('V');
printer.write(1);
}
void setHorizontalPrintingMode() {
printer.write(27);
printer.write('V');
printer.write(0);
}
Video
Het rechter knopje zorgt ervoor dat de printer een set aan tablature regels print en deze vervolgens wordt opgerold door de servo. Als je de knopjes beide indrukt, gebeurt eerst hetzelfde maar vervolgens blijft alleen de printer printen. Met het linker knopje kan je vervolgens de servo besturen en de rest van de geprinte tablature oprollen. De muzikant kan zelf zijn of haar nummer noteren in de lege tablature. En mocht het te donker zijn in de omgeving, gaat vanzelf het leeslampje aan!
Downloads
Reflectie
Ik heb erg veel geleerd van dit project. In eerste instantie wist ik helemaal niks van Arduino of solderen. Nu kan ik mijn eigen circuitjes aanleggen en ze werken ook nog! Ik heb door dit project een andere manier aangeleerd om naar elektronica te kijken. Dat voelt heel waardevol. Er zijn deurtjes open gegaan en ik heb meer inzicht gekregen in alle mogelijke projectjes die je thuis kan maken. Ook zonder ervaring kan je toch heel veel voor elkaar krijgen.
Een aantal dingen bedenk je pas gaande weg. Zoals de plaatsing van verschillende onderdelen of hoe je de bedrading moet laten lopen. Ook had ik de knopjes aan draadjes kunnen solderen om meer vrijheid te hebben in de plaatsing. Door dit project te maken kom je achter heel veel dingen die je de volgende keer anders gaat doen.
Ik heb ontzettend lopen stoeien met de code voor het printen van de tablature. Daarin zijn ook veel variaties voorgekomen. Een aantal hebben ook de specifieke tabs al geprint, maar dit was onpraktisch voor het eindconcept omdat je dan steeds in de code op je laptop dingen moet aanpassen. Daarom ben ik toch gegaan voor het met de hand noteren.
Over het solderen gesproken, ik heb geleerd dat het een kunst op zichzelf is. Naast dat ik zo nu en dan 10 seconden moest wachten tot mijn tin vloeibaar was, was het moeilijk naar mijn mening. Mijn soldeerwerk is in het algemeen te dik en sommige langere soldeerverbindingen hebben reliëf gekregen door de koude temperatuur van de bout. Nadat ik de ander soldeerbout had gevonden ging het een stuk beter aangezien de tin gelijk vloeibaar werd bij aanraking. Nou vond ik het nog steeds redelijk lastig, maar ik heb wel een aantal kleinere bolletjes kunnen maken. Ik wilde nog iets meer oefenen met de juiste soldeerbout en heb dit gedaan op een ander printplaatje. Hierbij lukte het iets beter om bescheiden te zijn met het tin en zag de langere connectie er iets overzichtelijker uit dan eerst. Solderen is echt iets wat je moet oefenen. Ik ben er nog niet zo goed in, maar ik heb wel eerste stappen gemaakt om er beter in te worden. Nu nog extra ervaring opdoen!
Over het algemeen ben ik blij met mijn eindproduct. Zeker sinds ik nog nooit zoiets heb gedaan werkt het eindwerk goed. Ik neem deze ervaring mee en ga mijzelf zeker nog eens wagen aan een Arduino project.