PDA

View Full Version : DIY midi control switcher



eriknoorland
30 oktober 2016, 18:16
Ik wil graag door middel van een Arduino een midi control switcher maken om mijn Mesa Boogie Dual Rectifier (3 channel) te schakelen via mijn Ground Control Pro. Ik heb een GCX audio switcher maar idealiter houd ik de 8 loops vrij voor effecten.

Het Arduino verhaal lijk ik vooralsnog wel uit te komen. Software schrijven is geen probleem voor mij. Echter waar ik mee zit is het schakelen van de Boogie door middel van de external switching jacks. De manual zegt het volgende over de external switching jacks:

"These jacks allow (usually MIDI-programmed) operation of your amplifier's functions from an external switching source. In either case, the switching is accomplished by connecting (“shorting”) the jack's "Tip" to its "Ring" (or ground.)"

Hoe schakel ik deze aan en uit via de Arduino? Moet ik daar een relais (4 om precies te zijn) voor gebruiken? Zijn er nog zaken waar ik rekening mee moet houden? Het laatste wat ik wil is natuurlijk mijn Boogie opblazen, uitbranden of iets dergelijks.

Alle hulp is welkom en alvast bedankt voor het meedenken.

D3nnis
30 oktober 2016, 18:43
Geen verstand van Arduino, maar let even op of je momentary of latching moet schakelen.


Latching schakelen als je momentary moet hebben werkt wellicht wel, maar volgens mij niet altijd gewenst.


Verder zou je voor de zekerheid even moeten checken of de grounds tussen de jacks common of geïsoleerd moeten zijn. Ik weet niet of dat in de handleiding staat bij deze amp.



Trouwens, waarom via Arduino gaan hobbyen? Er zijn best wel wat units nieuw of tweedehands te koop, voor een prijs waarvoor je bijna niet kunt hobbyen, tot aan heel duur.



Of gaat het niet puur om het functioneren alleen maar ook om de hobby? Dan heb ik niks gezegd ☺

Heynis
30 oktober 2016, 18:55
Arduino's zijn gewoon leuk. Zo leer je ook nog eens wat.

Bij Mesa is de common niet per se ook ground. Bij mijn Mesa is het bijvoorbeeld een +3 volt lijntje. Check dat even goed voor je de boel per ongeluk aan een echte ground knoopt.

Bij relais moet je goed opletten voor flyback voltages bij het ontkoppelen van de spoel. Als je de relais op 5 volt schakelt, moet er een 5V6 in sper over de spoel staan.

Heynis
30 oktober 2016, 21:49
Je kunt trouwens bistabiele relais gebruiken om het stroomverbruik te beperken als je niet schakelt. Het kost je wel 4 keer zoveel aanstuurtransistoren, maar die zijn toch praktisch gratis.

Als je monostabiele relais gebruikt, heb je redelijk wat stroom nodig om ze actief te houden. Reken op gemakkelijk een paar honderd milli-ampères per stuk. Dat houdt in dat je bijna verplicht bent tot een schakelende buck-converter als voeding. Dat is als je boven de 500mA gaat bijna alleen goed in SMD te doen (vanwege de beschikbaarheid van componenten en stabiliteitsproblemen), wat het hobby-gehalte nogal beperkt.

Met monostabiele relais kun je weg komen met een LM7805 of soortgelijk zonder koellichaam. Alleen tijdens het schakelen loopt er een significante stroom, maar in rust hoeft er alleen een zuinig microcontrollertje op te draaien.

Als je het ècht netjes wilt doen, geef je de microcontroller een eigen kleine voeding. Arduino's hebben nogal wel eens de neiging te crashen als de voeding teveel rimpel of dipjes heeft.

obiwanjacobi
31 oktober 2016, 07:32
Yep, relais is het meest betrouwbaar en veelzijdig - dan werkt het ook op andere versterkers. De (elctrische) isolatie tussen je schakelmodule en de versterker is ook erg fijn.

Mocht je een beetje C++ savy zijn, hier is mijn Arduino Template Library (http://atl.codeplex.com/) (work in progress) met o.a. MIDI support (vragen kan je op de discussion list kwijt).

HaroldA
31 oktober 2016, 09:03
Ik heb mijn midi switcher net af, dus kan je her en der wel wat helpen, gok ik zo ;)

http://www.newtone-online.nl/forum/index.php?action=dlattach;topic=7793.0;attach=1287 7;image

Ik moet alleen nog CC uit gaan voeren, maar alle PC's werken perfect!

* 14 bereikbare patches per bank: enkel (1-5), 2x drukken (6-10), en 2 tegelijkertijd (11-14).
* Rotary encoder voor het selecteren van banken.
* Midi in, uit en phantom power via 7-pin DIN.
* Buffer en patchbox.
* Todo: 4 ongebruikte jacks voor CC.

eriknoorland
31 oktober 2016, 18:46
Wow, wat veel informatie zo snel al. Thanks guys!

@D3nnis, in de manual staat niet meer over de external switches dan ik had geplaatst in mijn openings post. En waarom Arduino is ook vanwege het hobbyen. Geld is zeker geen issue maar ik vind het vooral leuk om er zelf mee aan de slag te gaan om er ook iets van te leren. Als het goed werkt in de praktijk neem ik het zeker op in m'n rig en anders kan ik altijd nog een switcher kopen ;)

@Heynis, Heel eerlijk gezegd weet ik erg weinig van relais en was ik het ergens tegen gekomen bij iemand anders z'n project. In verband met de Arduino zat ik naar zo'n relais board als dit te kijken - https://www.kiwi-electronics.nl/4-kanaals-relais-module?search=relais Is zoiets voldoende? Of zit ik dan helemaal verkeer te kijken? Dit project zou sowieso z'm eigen voeding krijgen via de power conditioner in het rack.

@obiwanjacobi, Thanks voor de tip! Ik ga er zeker naar kijken want alle info is welkom.

@HaroldA, Nice! Je hebt een uitgebreider project dan wat ik (vooralsnog) voor ogen heb. Ik wil makkelijk beginnen en van daaruit kijken hoe ik het kan uitbreiden. Voorlopig werkt de gcx prima en kan ik eerst wat prototypen.

Echter begrijp ik nu nog niet helemaal hoe ik de jacks zou moeten schakelen. Ik lees veel over gcx's en andere switchers maar niet iemand die het voor een Dual Rectifier zelf heeft gemaakt. Ik ben echt een newb in elektro :( Maar ik leer graag!

obiwanjacobi
1 november 2016, 06:47
Echter begrijp ik nu nog niet helemaal hoe ik de jacks zou moeten schakelen.


"the switching is accomplished by connecting (“shorting”) the jack's "Tip" to its "Ring" (or ground.)"

Steek maar eens een jack in de switch input van de amp en sluit de tip en sleeve met elkaar kort...

Dus je hebt een relais nodig met (minimaal) 1x maak contact die de tip en sleeve (denk niet dat het "ring" is -stereo) met elkaar verbindt. Daarna heb je een 'driver' nodig om het relais met de arduino te schakelen. Let op dat een relais meer stroom nodig heeft dan de arduino direct kan schakelen EN dat bij het uitschakelen van een inductieve load (de spoel van het relais) een tegengestelde spanning wordt opgewekt door de spoel. Een diode (anti-parallel) kan dit onschadelijk maken.

Helpt dit?

EDIT: Zoiets moet het worden
http://www.dnatechindia.com/images/stories/8051_Tutorial/Interfacing_Relay_to_Microcontroller_/Relay_Driver_Circuit_Using_Single_Transistor.jpg

herrieman
2 november 2016, 08:36
Altijd bewonderingswaardig wanneer mensen zelf aan de slag gaan.
Zat ook te denken om weer eens de soldeerbout ter hand te nemen.
Tot ik dit tegenkwam. http://www.daelectronics.com/
Bouwer is nu bezig een Editor te maken. Tot die tijd programmert hij het apparaat naar jouw wensen.
Gisteten besteld. Eens kijken hoe het werkt

HaroldA
2 november 2016, 09:39
Tot ik dit tegenkwam. http://www.daelectronics.com/
Bouwer is nu bezig een Editor te maken. Tot die tijd programmert hij het apparaat naar jouw wensen.
Gisteten besteld. Eens kijken hoe het werkt

Dat vind ik maar een eng apparaatje ... geef mij maar een echt expressiepedaal ipv met je voet er naast bewegen.

herrieman
2 november 2016, 16:16
Ik ben wel in voor wat spanning en sensatie ;-) Lekker een beetje eng :seriousf:
Maar gelukkig zit er ook nog een jack input voor je veilige volume pedaaltje.

eriknoorland
3 november 2016, 08:53
@obiwanjacobi, Is dit iets wat ik kan gebruiken? https://www.kiwi-electronics.nl/4-ka...?search=relais Het is vergelijkbaar met wat ik gevonden heb ik in deze blog post bij iemand die iets soortgelijks heeft gemaakt (http://www.diystompboxes.com/smfforum/index.php?topic=112424.0).

Ik heb al eens een jack in de switches gestoken en de tip en ground verbonden maar dat gaf een buzzend geluid vanuit de versterker. Leek me niet helemaal de bedoeling.

@herrieman, Ik denk niet dat dat kastje is wat ik zoek.

obiwanjacobi
3 november 2016, 10:18
Je kan elke willekeurige 5V relais boardje gebruiken die je kan vinden.
Bijv: http://www.ebay.com/itm/Relay-5V-Channel-NEW-Expansion-Low-Level-Trigger-Module-Relay-For-Arduino-Board-/232103143010
(bedenk wel dat je 4 individuele relais nodig hebt)

Zou er dan toch een "ring" (een stereo plug dus) op de external switches zitten?

eriknoorland
3 november 2016, 10:21
Ik gebruik nu de Voodoo Lab GCX om de Boogie te switchen met een mono jack. Ik ga er stiekem een beetje vanuit dat de GCX op zo'n zelfde manier werkt als wat ik nu zelf wil bouwen. Zeker omdat je een duidelijke klik (van de relais neem ik aan) hoort als er geswitched wordt.

D3nnis
3 november 2016, 11:25
Ik heb al eens een jack in de switches gestoken en de tip en ground verbonden maar dat gaf een buzzend geluid vanuit de versterker. Leek me niet helemaal de bedoeling.


Is dat niet het geluid van de spoel van een relais dat bekrachtigd blijft?
Ik denk dat je momentary switching nodig hebt namelijk; mijn Roadster schakelt ook met momentary; een schakelmoment van max 100ms is genoeg; veelal is veel minder genoeg, maar veel switchers, oa die van RJM, hebben een pulse van 100ms.

eriknoorland
3 november 2016, 11:35
Dat zou ik dan kunnen testen door het nog eens kort te proberen en dan zien of de versterker geschakeld is. Dat ga ik proberen.

D3nnis
3 november 2016, 11:40
Precies; als je kort de tip naar sleeve kortsluit, en de versterker schakelt naar het corresponderende kanaal en blijft dan ook op dat kanaal staan, dan weet je het 👍

eriknoorland
3 november 2016, 18:33
Het is geen momentary switch. Wanneer ik de tip en ground disconnect dan schiet de amp naar haar default channel (orange channel). Ik heb dus een latching switch nodig.

Overigens had ik nu geen buzz.

D3nnis
3 november 2016, 19:01
Eigenlijk gunstig; dan heb je maar twee relais nodig om de drie kanalen te schakelen (en, waar het om gaat, daarom ook maar twee kabels).
Ga je de switcher in de top inbouwen, of niet?

eriknoorland
3 november 2016, 19:13
Ik denk dat ik toch voor 4 ga omdat ik ook de solo boost en FX loop wil kunnen schakelen. Of ik het gebruik is een tweede maar dat maakt verder niet heel veel uit. Wie weet in de toekomst.

Ik ga de switcher niet in de amp bouwen maar in een stompbox doosje of in een 19" rack doos (maar die kan ik nog niet vinden voor een schappelijke prijs in een klein (lees niet diep) formaat). Ook verander ik liever niets aan de amp zelf. Zoals je merkt gaat mijn elektro kennis niet heel diep :)

D3nnis
4 november 2016, 07:17
Bij Thomann hebben ze wel rack housings, die zijn over het algemeen 25cm diep, bijvoorbeeld deze:https://m.thomann.de/nl/adam_hall_87407_19_1hegehaeuse.htm?ref=msg_a_0
Weet niet of dat een beetje is wat je zoekt?

eriknoorland
4 november 2016, 08:59
Die had ik ook gevonden alleen denk ik dat 25cm te diep is. Ik heb geen ruimte meer aan de voorkant van het rack dus het zal aan de achterkant moeten :) Ben meer op zoek naar het formaat van een rack tuner qua diepte. Tussen de 5 en 10cm denk ik. Zal lastig worden en misschien is het geen hard requirement. Eerst maar zorgen dat ik alle onderdelen in huis heb en dat het werkt. De casing komt later ;)

Brexit of niet, ze hebben het spul daar wel :p http://www.allmetalparts.co.uk/707-1u-19-inch-rack-mount-100mm-non-vented-enclosure-chassis-case-5055726206361.html

obiwanjacobi
4 november 2016, 10:56
Als je geen display en buttons hebt zou ik een klein doosje doen die je ergens achter je rack kan frommelen...
5V adaptertje erbij en klaar ben je.

eriknoorland
4 november 2016, 11:04
Er is weinig "floor" space in de flightcase en ik zit er wel aan te denken om het uit te kunnen breiden met een display en buttons om het channel aan te kunnen passen. Maar in de eerste versie komen (vooralsnog) alleen LED's.

D3nnis
4 november 2016, 11:55
Zou je daarom niet toch overwegen om hem in je top te bouwen? Klein blokje moet ergens achter in de top wel bij te monteren zijn? Zeg maar met een bevestigingsbeugel vanaf de handvat-bevestiging af of zo? Hoef je maar met 1 (midi) kabel naar je top ipv 4 jack kabels; alle beetjes helpen ☺

eriknoorland
4 november 2016, 12:11
Ik heb een voorkeur maar houd alle opties nog wel open ;)

D3nnis
4 november 2016, 12:17
Mooi project in ieder geval!

obiwanjacobi
5 november 2016, 07:21
Ik zou zeker eerst een werkend prototype maken voordat je gaten gaat boren...

eriknoorland
5 november 2016, 12:19
De eerste twee successen zijn behaald. Het midi input circuit werkt en de aansturing van de relais ook (en daarmee dus ook het schakelen van de amp). Nu het prototype helemaal afmaken zoals ik het in zou willen bouwen, testen en afronden :)

Voor zover alvast iedereen erg bedankt voor de hulp en adviezen. Mocht ik nog vragen hebben dan volgen die hier vanzelf. Als het project af is zal ik ook wat foto's plaatsen.

obiwanjacobi
5 november 2016, 13:41
Het hoeft niet af te zijn om fotos te plaatsen, hoor... :soinnocent:

:crazyhappy:

eriknoorland
5 november 2016, 16:46
Toch nog een vraag :) Ik gebruik de Voodoo Lab Ground Control Pro om de switcher aan te sturen. De midi kabel loopt van de GCP via de GCX naar mijn custom switcher. Ik wil geen gebruik maken van de instant access buttons anders verlies ik alsnog de controle over m'n effectenpedalen (die ik zomaar eens naar 8 pedalen zou kunnen uitbreiden).

Waar ik tegenaan loop is dat wanneer ik in een preset een midi device wil aansturen het een program change is (in tegenstelling tot een midi cc message wanneer ik een instant access knop gebruik). Dat betekend, software technisch gezien, dat ik alleen een program number krijg wanneer ik een preset kies en dus niet wanneer ik een andere preset kies en het program uit moet en een andere aan moet. Kortom, ik kan alleen programs aan- en niet uitzetten lijkt het. Ik hoop dat ik het een beetje duidelijk uitleg. Iemand daar ervaring mee?

Wat ik zou kunnen doen, omdat ik het specifiek voor mijn Boogie maak, is dat wanneer ik een program selecteer dat bestemd is voor channel switching (green en red) dat ik dan de andere channel uitzet. Hardcoded. Ik zou dit altijd weer via software kunnen omschrijven indien nodig. Toch?!

@obiwanjacobi, ik zal kijken wat ik kan doen. Voor nu kan je de prototype tests zien op Instagram - https://www.instagram.com/eriknoorland/

D3nnis
5 november 2016, 20:15
Ik snap het geloof ik niet helemaal.
Stel dat je een program change hebt voor kanaal A, een program change voor kanaal B, en een program change voor kanaal C, wat werkt er dan wel of niet?

eriknoorland
5 november 2016, 20:51
Ik krijg alleen een midi program change binnen wanneer ik een preset selecteer. Dus als preset 1 het groene kanaal aanzet en preset 2 het oranje kanaal en ik switch van preset 1 naar preset 2 dan komt er geen signaal binnen dan preset 1 uit moet.

Nu heb ik dat in de software opgelost door bij elke program change die een kanaal op de versterker schakelt eerst alles uit te zetten en dan aan zetten wat er volgens de geselecteerde preset aan moet. Dit werkt echter alleen bij het switchen van kanalen. Het aan- en uitzetten van de boost en FX loop zal op deze manier niet werken. Tenzij ik programs maak voor elke schakelbare mogelijkheid maar dat voelt een beetje alsof dat niet zo zou moeten (tenzij dit is hoe midi programs werken maar daar heb ik dus geen kennis van).

Dit is de code (nog ongetest) die ik tot nu toe gemaakt heb - https://github.com/eriknoorland/arduinoMidiAmpSwitcher/blob/master/arduinoMidiAmpSwitcher.ino

obiwanjacobi
5 november 2016, 22:30
Program changes zijn bedoeld voor het oproepen van complete instellingen ook wel presets.
Control Changes zijn bedoeld voor het real-time aanpassen van aspecten van de preset.

De mooiste manier om dit op te lossen is om ook in jouw switcher presets te ondersteunen (met 4 switches heb je er daar niet zoveel van). Daarnaast kan je dan een map maken die van je program change nummer (0-127) mapt naar een van jouw presets. Omdat het totaal aantal mogelijke presets zo klein is zou ik die gewoon vastleggen in code (tabel) en alleen de mapper in de UI maken (LCD display erbij met een rotary encoder).

Control changes zou je kunnen ondersteunen om elke switch individueel aan/uit te zetten. Dan kies je vier control change nummers (die nog niet een standaard toekenning hebben) en daar reageer je op. Wil je het fancy, dan maak je die programmeerbaar (door de gebruiker).

Edit: kijk uit met het gebruik van delay() in je code. Hierdoor kan je mogelijk MIDI berichten missen wanneer deze snel achter elkaar worden verzonden.

eriknoorland
6 november 2016, 08:43
Thanks, dit is de bevestiging van wat ik wilde weten. Ik denk dat ik ook die kant op ga om het programmeerbaar te maken. Dan moet ik alleen wel een handleiding voor mezelf gaan schrijven :p

Die delay is nu even voor het testen van iets. Ik moet even kijken hoe ik asynchrone code kan schrijven in Arduino. Ik ben namelijk een javascript developer. Daar werkt alles net even anders :)

obiwanjacobi
6 november 2016, 08:52
Ik kan je daar wel mee helpen. In mijn library zitten voorbeelden hoe je dat mooi en simpel kan doen.

http://atl.codeplex.com/SourceControl/latest#Source/Code/Arduino Libraries/ATL_Process/examples/Task/Task.ino

Laat maar weten als je vragen hebt.

eriknoorland
6 november 2016, 13:14
@obiwanjacobi, Ik ga zeker kijken naar je library.

Nu heb ik nog een voorkeursvraag. De relais boards hebben allebei headers om gemakkelijk kabels op vast te maken. Is dat aanbevolen om te gebruiken of kan je beter solderen? Ik vraag dit omdat ik de Arduino (micro of nano) nog moet bestellen en ik twijfels tussen met of zonder headers. Ook moet ik nog bepalen hoe ik de bekabeling ga bevestigen (shroefterminals of headers) aan het perfboard wat ik gebruik voor mijn midi in circuit.

Bottom line, is het gebruik van headers goed (genoeg) voor een in gebruik te nemen apparaat?

obiwanjacobi
6 november 2016, 14:10
Als je alle prints goed in je behuizing bevestigd, kan je alle onderlinge draden gewoon solderen.
Als je een Arduino mini/nano (pro) koopt dan worden meestal de header-pins (pootjes om hem in je breadboard te prikken) sowieso los meegeleverd.

Je kan ook (wel) met (1/4") headers werken. Dan zou je een pref board kunnen maken waar de Arduino en je relais board inprikken (en je MIDI opto bevat)...

Welke optie je kiest hangt een beetje af van hoe de prints in de behuizing gaan passen en wat je makkelijk vindt: losse draden of de verbindingen via je perf-board regelen...

Choices, choices

(Ik zou zo min mogelijk draden kiezen)

HaroldA
7 november 2016, 08:59
Timer1 (https://github.com/PaulStoffregen/TimerOne) is ook een goede library voor timers. En Bounce2 (https://github.com/thomasfredericks/Bounce2) voor knoppen. Encoder (https://www.pjrc.com/teensy/td_libs_Encoder.html) voor rotary encoders.

eriknoorland
8 november 2016, 13:02
Onderdelen zijn besteld (Arduino Nano, LCD, rotary encoder, etc.). Het wordt dus een uitgebreid en programmeerbaar apparaat om het flexibel te houden voor eventuele andere toepassingen. Leuk voor de uitdaging en (hopelijk) mooi voor het eindresultaat.

obiwanjacobi
8 november 2016, 13:31
Awesome! :cooler:

eriknoorland
14 november 2016, 20:48
Quick update: de rotary encoder, push buttons en lcd (16x2) werken goed. Nu ben ik alle kleine stukjes en beetje bij elkaar aan het vegen om er één project van te maken. Voornamelijk nu druk met de software om alles menu's en settings er goed in te krijgen. Nog een lange weg te gaan maar het gaat de goede kant op.

Ik heb toch besloten om voor een 50mm diepe rack behuizing te gaan (die is ondertussen ook binnen) in verband met de ruimte en uitstraling van het rack. Ook gezien de extra functionaliteit met de buttons en display denk ik dat dit een goede keuze is. Ik kijk misschien nog wel het meeste op tegen het metaal bewerken (en dan zo mooi mogelijk natuurlijk). #fingersCrossed

obiwanjacobi
15 november 2016, 07:05
Photo's or it didn't happen. :seriousf:

Klinkt goed. Ja, die software neemt altijd meer tijd dan de hardware.

HaroldA
15 november 2016, 09:43
Klinkt goed. Ja, die software neemt altijd meer tijd dan de hardware.

Bij mij is het precies andersom en kijk ik zelfs op tegen de hardwarematige uitvoering.

eriknoorland
27 december 2016, 13:52
Right, mini update. De Arduino Leonardo die ik gebruikte om alles op te testen lijkt niet meer compatibel te zijn met mijn nieuwe MacBook (of iets dergelijks). Dus ik ben overgestapt naar de Arduino Nano (die uiteindelijk ook gebruikt gaat worden in het eindproduct).

Ben nog steeds met de software bezig. Op dit moment vooral met de navigatie voor de verschillende settings. Daarna nog even wat testen met EEPROM en hopelijk heb ik dan alle losse onderdelen ready to go om er een compleet pakketje van te maken.

https://www.instagram.com/p/BOhWZUrFwVn/?taken-by=eriknoorland

obiwanjacobi
27 december 2016, 14:07
:ok:

Steady as she goes...

eriknoorland
29 december 2016, 17:04
Nog een update.

De software is zo goed als af. Eigenlijk alleen het schrijven naar EEPROM nog testen. Maar dat stel ik zo lang mogelijk uit vanwege de gelimiteerde hoeveelheid je kan schrijven (ik weet dat dat best vaak kan maar toch). Via deze link kan je de software bekijken, https://github.com/eriknoorland/arduinoMidiAmpSwitcher/blob/master/arduinoMidiAmpSwitcher.ino

Waar ik nu nog mee zit is het volgende. Wanneer één of meerdere outputs actief zijn dan wil ik dat graag aanduiden door middel van een LED. Echter schakelt het relais wanneer de output low is. Dat betekent dat ik niet ook een LED kan laten branden op dezelfde poort (toch?!). Het omdraaien van de werking van de relais (van NO naar NC (of andersom)) doe ik liever niet omdat in opstart gevallen de versterker alles aan heeft staan en ik kan me voorstellen dat dat schade op kan leveren.

Nu zat ik te denken, wellicht kan ik een shift register gebruiken. De Arduino Nano heeft natuurlijk maar een beperkt aantal pins ter beschikking en door middel van een shift register te gebruiken kan ik 8 pins schakelen met 3 pins. Dan kan ik zelfs de eerste 4 gebruiken voor de relais en de laatste 4 voor de LED's.

Goed idee? Of te moeilijk gedacht en het kan simpeler?

nico verduin
29 december 2016, 17:10
Nog een update.

De software is zo goed als af. Eigenlijk alleen het schrijven naar EEPROM nog testen. Maar dat stel ik zo lang mogelijk uit vanwege de gelimiteerde hoeveelheid je kan schrijven (ik weet dat dat best vaak kan maar toch). Klopt slechts > 100.000 keer....

nico verduin
29 december 2016, 17:17
Als je meer io nodig hebt kun je gerust een schuif register gebruiken of een I2C IO expander. Je kan een LED laten branden door een 330R weerstand te verbinden met de 5V en dan de LED-Anode en tenslotte de LED kathode te verbinden aan de datapin. Als je nu laag gaat dan gaat ook de LED branden.

eriknoorland
29 december 2016, 18:18
Je kan een LED laten branden door een 330R weerstand te verbinden met de 5V en dan de LED-Anode en tenslotte de LED kathode te verbinden aan de datapin. Als je nu laag gaat dan gaat ook de LED branden.

Als de relais uit moet en er dus 5V uit de datapin komt dan is dat geen probleem voor de LED (dat je zowel aan de anode als kathode kant 5V hebt staan)?

cluseau
29 december 2016, 19:49
Als de relais uit moet en er dus 5V uit de datapin komt dan is dat geen probleem voor de LED (dat je zowel aan de anode als kathode kant 5V hebt staan)?

Nee tuurlijk niet, er staat dan immers niks over de led.

obiwanjacobi
30 december 2016, 07:22
Ik heb je software niet helemaal uitgespit, maar over het algemeen moet je voorzichtig zijn met het gebruik van delay in een real-time app.
Ik zie vooral by onMidiActivity een potenteel probleem aangezien je daar 3x 40 ms = 120 ms wacht.

Voor program-changes wellicht niet een issue aangezien deze meestal niet zo snel achter elkaar komen, maar voor control-changes zou ik nog even goed testen, ook met andere controllers die wellicht op een sneller tempo hun messages verzenden...

Verder, goed bezig! :ok:

eriknoorland
30 december 2016, 09:04
Nee tuurlijk niet, er staat dan immers niks over de led.

@cluseau, omdat elektronen van min naar plus stromen?

@obiwanjacobi, ik ben me er van bewust. Dat is zeker iets waar ik nog naar moet kijken. Maar voor nu niet het allerbelangrijkste. Vooralsnog ga ik control changes niet gebruiken maar ik heb het maar wel ingebouwd.

cluseau
30 december 2016, 09:24
@cluseau, omdat elektronen van min naar plus stromen?

Als kathode 5V is en anode ook, wat is dan het spanningverschil tussen anode en kathode? ;)

eriknoorland
30 december 2016, 09:30
0V :) Dit zijn nu net de trucjes die ik niet weet. Thanks!

nico verduin
30 december 2016, 11:52
Ff je code gescand. Hoewel het hier vermoedelijk wel goed gaat ivm String gebruik, wees er voorzichtig mee bij de meeste microcontrollers. String() alloceert weer een nieuw stukje ram als er een teken bijkomt en geeft het oude vrij. Dat leidt ertoe dat er fragmentatie van het RAM geheugen ontstaat. Wel worden losse stukken die achter elkaar staan weer aan elkaar geplakt, maar het zou verkeerd kunnen gaan.
Eerste indruk code is niet eens zo gek. Best te lezen en beter dan de meeste code die ik tegenkom op de forums. Ik zou zelf nog wat meer commentaar toevoegen maar dat is meer het sausje. Je gebruikt doxygen parameters die kun je verder nog uitbreiden met een @brief en de parameters beschrijven. Daarna een website genereren van je programma (kun je ook nog de schema's etc toevoegen) met doxygen en je project is gedocumenteerd.

eriknoorland
30 december 2016, 12:36
Het is m'n eerste project in C code en ik ben er zelf erg tevreden over. Er is zeker een hoop dat mooier en beter kan. Maar dat kan altijd nog in latere versies van de software. Wat betreft de strings gebeurd daar niet zo heel veel mee. Ze zijn vooral voor weergave met uitzondering van de presets. Daar wordt ook doorheen gelopen om de outputs te (de)activeren.

Documentatie generen is een goede tip. Schema's moet ik eigenlijk nog maken (is logisch dat je dat achteraf doet toch?! ;) )

obiwanjacobi
30 december 2016, 12:49
Tja, er zijn nog wel wat zaken die anders zouden kunnen in je programma.
Als je daar aan toe bent moet je nog maar eens roepen.

Maar voorlopig, als het werkt het is het goed (genoeg).
Wel van belang dat je het goed test en er zeker van bent dat ook na gebruik op langere duur er geen problemen optreden.

Laat ook iemand anders er eens mee spelen (die er geen verstand van heeft) en dan zal je zien dat deze het op een andere manier gebruikt dan jij had voorzien.... (meestal)

Schema's (schematic) maak ik meestal vooraf - om het idee vast te leggen en er zelf over te kunnen denken. Eventuele wijzigingen in je design kan je dan gelijk vastleggen. Zeker als je niet continue aan een projectje werkt (kan werken) is dit best handig vind ik. Bij zo'n klein projectje als dit kan je het nog wel in je hoofd houden of op een kladje schrijven, maar als de projecten groter en complexer worden ga je daarop mank. Maar dat merk je dan snel genoeg :satisfie:

Ik zit eigenlijk nog te wachten op een filmpje met een demo... ;)

eriknoorland
1 januari 2017, 17:47
@obiwanjacobi, ik ben heel benieuwd naar eventuele verbeteringen in de code. Goeie tip overigens om er iemand anders ook naar te laten kijken. ga ik zeker doen.

Een vraagje nog. Ik gebruik voor de functies store en exit van die simpele momentary / tactile buttons (met een vierkante afwerking). Weet iemand waar je daar mooie dopjes voor kan vinden? Of buttons die dat al hebben? Ik ben ondertussen begonnen aan de layout van de front en rear panel en daar heb ik die buttons voor nodig.

obiwanjacobi
2 januari 2017, 08:38
@obiwanjacobi, ik ben heel benieuwd naar eventuele verbeteringen in de code.

disclaimer: veel van dit soort dingen is persoonlijke smaak en wat je gewent bent/geleerd heb dat goed is. Blijf vooral zelf nadenken en probeer een paar dingen uit. Bevallen ze niet, draai je het terug.

- Verdeel en heers: Je hebt nu alle code in 1 file, meer dan 800 regels. In mijn ogen is dat wat veel. Je zou je code kunnen opsplitsen in de kern bestanddelen. Hierdoor wordt je niet met alle details tegelijk geconfronteerd. Bij een projectje van deze grootte gaat het nog wel, maar ga je verder, dan wordt het lastig.

- C++: In verlengde op het eerste punt, kan je C++ gebruiken om classes (objecten) te maken waarin delen geencapsuleerd zijn. Als je hier wat ervaring in krijgt zal je misschien ook zien dat je her en der wat code kan gaan hergebruiken. Arduino is C++, all wordt dat vaak genegeerd om het simpel te houden. Arduino code is over het algemeen geen goed voorbeeld van hoe het beter zou kunnen ;-)

- State machine: Ik zie dat je ook een state machine gebruikt. De switch statements zou je kunnen om-schrijven naar calls op virtual methods op state classes. Sommige mensen vinden dat juist minder duidelijk - en bij hele complexe state machines, met sub-states etc, is dat wellicht ook zo. Maar voor dit geval krijg je mooie kleine classjes met precies per state-class de functionaliteit die die specifieke state voorstelt.

-Interrupts: knopjes/decoders op interrupts aansluiten is gevaarlijk. Contacten denderen (bijna altijd) en dat kan betekenen dat er meerdere interrupts gegeneerd gaan worden - tenzij je hardware de-bouncing hebt toegepast (RC). Naar mate een contact slijt zal dit alleen maar slechter worden en bestaat de kans dat je meer tijd in je interrupt handlers doorbrengt dan in je Midi-loop. Een alternatief is een polling timeout op te zetten en die een interrupt laten genereren. In die handler lees je alleen de waarde in van de schakelaars, verder niks. In je main loop check je of er nieuwe waarden zijn en wat de state van je buttons dan wordt etc.

-Gebruik van delay: Met het gebruik van delay in je main loop moet je echt op passen. Tijdens init/setup is het geen probleem (LCD doet dat bijv) omdat dat eenmalig is. Beter is om een taak-strategie toe te passen. Mijn Task macros (Task.h) zijn daar een voorbeeld van. Het idee is dat de main-loop alleen maar alle taken aan roept die je systeem moet uitvoeren. Elke taak zorgt dan weer dat zijn deel wordt afgehandeld. Heeft een taak even niks te doen, returnt deze direct. Heeft een taak wel wat te doen, dan doetie dat zo snel mogelijk. Langere acties binnen taken kunnen worden op gesplitst in deel-acties, zodat de main loop niet te lang weg blijft en andere taken geen tijd ontnomen wordt. De MIDI.Read is zo'n taak-method. Dit zou dan ook je onMidiActivity met zijn delays probleem oplossen.

-Naamgeving: Wanneer je in C programmeert is het meestal lastig te zien waarbij een functie hoort/wat een functie doet. Je zou door naamgeving daar duidelijkheid in kunnen aanbrengen. Dus ipv updateDisplayLine, kan je beginnen met het component (of module) waar de functie logisch bij hoort: Display. Daarna het object dat deze manipuleert of nodig heeft om iets uit te lezen: Line en als laatste de actie: Update. Dan krijg je dus: Display_Line_Update. Het klinkt achterste voren, want we willen allemaal graag dat onze code als een engelse zin leest. Alleen is code geen engels en heb je (denk ik) meer aan een naam die duidelijk aangeeft watie doet en waardie het op doet. Soms heb je geen object: Display_Init, Display_Clear, Settings_Read etc. Gebruik van casing en underscores naar smaak invullen.

- Clean code: is een boek van Robert Martin met daarin ideeen om je code beter te structureren. Ik zeg niet dat alles van toepassing is op embedded development (boek is vooral geared naar OOP en grotere IT systemen), maar een aantal zijn zeker goed om eens te bekijken.

BTW: Default midi channel 2 is heel raar :soinnocent: :seriousf:

nico verduin
2 januari 2017, 09:13
Het is m'n eerste project in C code en ik ben er zelf erg tevreden over. Er is zeker een hoop dat mooier en beter kan. Maar dat kan altijd nog in latere versies van de software. Wat betreft de strings gebeurd daar niet zo heel veel mee. Ze zijn vooral voor weergave met uitzondering van de presets. Daar wordt ook doorheen gelopen om de outputs te (de)activeren.

Documentatie generen is een goede tip. Schema's moet ik eigenlijk nog maken (is logisch dat je dat achteraf doet toch?! ;) )Hardstikke!! altijd achteraf plannen.... dan hoef je het niet meer te doen :)

eriknoorland
2 januari 2017, 20:52
Wow, @obiwanjacobi, jij hebt zeker even in de code gekeken ;) Allereerst bedankt voor alle feedback!

Object oriented programming stond wel op m'n lijstje maar gezien dit mijn eerste Arduino project is vond ik het nog wat hoog gegrepen. Het is duidelijk dat ik C++ nog niet beheers. Ik heb net even wat voorbeelden gezocht met betrekking tot het state pattern wat hier goed zou passen maar daar loop ik nog wel tegen het één en ander aan. Eigenlijk vooral de context class. Want dat zou in mijn geval de main app zijn (de .ino file). Maar dat is dan weer geen object. Daar moet ik nog even wat best practices in vinden.

Wat betreft de interrupts was dat zo'n beetje het enige dat ik kon vinden dat werkte. Ik weet niet of dit geldt als hardware de-bouncing maar ik maak gebruik van twee condensatoren bij de rotary pins. Vooralsnog heb ik vrij soepel door de navigatie kunnen scrollen.

De delay is inderdaad wel iets waar ik iets mee moet doen. Het is gelukkig maar 120ms en ik verwacht niet dat ik ooit sneller moet schakelen dan dat maar toch.

Wat de naamgeving betreft ben ik toch een beetje allergisch voor underscores. Typt ook zo vreselijk irritant. Sommige functie namen zouden misschien wat liefde kunnen gebruiken maar de kans dat een ander met mijn code moet werken is erg klein. Als het project groter zou worden / zijn dan zou dit in theorie met het toepassen van OOP (deels) opgelost zijn.

O, en de midi channel 2 is inderdaad een beetje gek. Omdat ik nog niet heb uitgezocht hoe ik Midi.begin(<midi channel hier>) opnieuw zou kunnen of moeten aftrappen gebruik ik een hardcoded waarde. Ik zou natuurlijk op alle channels kunnen luisteren en dan in de midi handlers of channel kunnen controleren maar misschien kan het ook netter binnen de midi library. Dat is nog even uitzoeken. Ook staat de EEPROM write nog uit.

eriknoorland
10 januari 2017, 19:56
Project OOP is van start gegaan. https://github.com/eriknoorland/arduinoMidiAmpSwitcher/tree/oop
Ik neem het dus meteen mee want ik heb voorlopig nog geen haast met de afwerking van het project.

Weet iemand hier toevallig waar je een beetje mooie simpele vierkante of rechthoekige drukknoppen (of alleen doppen voor drukknoppen) kan vinden? Ik heb wel een dop gevonden voor de switches die ik nu gebruik maar bij Conrad moet ik er daar dan meteen 500 van bestellen en ik heb er maar 2 nodig :)

HaroldA
10 januari 2017, 22:14
Project OOP is van start gegaan. https://github.com/eriknoorland/arduinoMidiAmpSwitcher/tree/oop

Moet ik ook nodig met mijn Arduino-projectjes gaan doen ... zijn allemaal net iets te groot geworden om goed overzicht te houden.