Serial cases arduino (Simple Message System v2 – Arduino koppelen aan bv. MaxMSP)

Door seriële data kan je data verzenden van een programma naar je Arduino.  Een programma kan Max/Msp zijn welke via het [ serial] object seriële data kan verzenden en ontvangen. Zo kan je bijvoorbeeld een lejde aanzetten door Max/Msp. De makers van Simple message system (SMS) hebben dit extra makkelijk gemaakt. In onderstaande versie van SMS hebben wij (Mark de Reijer & Thomas Huster) wat aan toegevoegd zodat oa servo’s en stappenmotors kan bedienen.

Functies

  • Digitaal lezen (multi)
  • Analoog lezen (multi)
  • Digitaal schrijven (multi)
  • Pwm schrijven (multi)
  • Servo (multi)  Hoek & snelheid*
  • Stepper Motor  Hoek & snelheid*  (1 – in de code aan te passen naar meerderen) Ondersteuning voor een Easydriver van sparkfun en een transistor array.

* Kijk even bij “special notes” – deze onderdelen vergen enige uitleg.

Benodigdheden

  • Een Arduino (ik heb het getest met een fake Uno R3)
  • Een programma dat seriële data verstuurd / ontvangt. Hier doen we het voor met Max/Msp (ik heb getest met v5)  Of onderzoek het seriële object van pure data.  Met MaxRuntime kan je het max bestand openen maar niet bewerken.
  • Arduino software (getest met v1.05)
  • serial cases arduino bestanden & code! 🙂

Stappenplan

Hier zal ik per map uitleggen wat er in staat en wat je er mee moet doen. Maar eerst beginnen we met de voorbereidingen.

1. Voorbereiding:

  1. Zorg dat je Arduino werkt (heb je het juiste board geselecteerd?  juiste com poort? )
  2. Heb je een serieel programma werkend? (bv Max/Msp)
  3. Sluit alle Arduino / Max vensters

2. We beginnen met de map “Library” of “Arduino Library” in het zip bestand. 

  1. Hier in staan Librarys. In deze mapen staan bestanden met veel voorkomende code waar je arduino code op terug grijpt. Hierdoor is je hoofd code een stuk overzichtelijker.  Een deel wordt standaard met de arduino software geleverd, maar onderstaanden niet. Daarom moet je deze toevoegen zelf er even in plakken.
  2. Zet alle mappen die hierin staan (oa SimpleMessageSystem & VarSpeedServo) in de  map “libraries” van je arduino folder.
arduino libary

De arduino ‘library’ map op windows. Het pad staat bovenin de afbeelding. In de afbeelding ontbreken de andere mappen die je er in moet zetten.

3. Vervolgens de map “code” of “Arduin code”

  1. Hier in staat een .ino file met de code die je laat communiceren tussen je Arduino pinnen en je pc.
  2. Open het bestand en upload het met de Arduino IDE op je arduino.
  3. Je arduino is nu klaar om te communiceren met je pc!
  4. heb je een meer poorten die je uit kan & wil lezen (bv een aruino mega)? Verander dan de 14 en 6 in “void readpins” naar het gewenste aantal

Control Arduino board functions with the following messages:
r a -> read analog pins
r d -> read digital pins
w d [pin] [value] -> write digital pin
w a [pin] [value] -> write analog pin
w s [pin] [value] -> write servo pin ()
w v [pin] [deg] [speed] -> write servo pin, deg and speed
w z [speed] [deg] -> write EasyDriverStepper (van sparkfun) degrees and speed (speed is een float tussen 0. en 1. (bijv. 0.2))
w x [speed] [deg] -> write Smallstepper die werken met 4 draden driver (bv uln2003) driver. Steppermoter die daar mee werkt is een 28BYJ48 zijn.
*/

4. Max/MSP only: “Max/Msp” map

  1. Hier in staat de MaxPatch die ik speciaal heb gemaakt zodat je gelijk aan de slag kunt!
  2. Open de .maxpat file
  3. Het enige wat je nu nog moet doen is in Max aangeven welke COM poort je gebruikt. Klik hiervoor op “print. In het max window verschijnt het poort nummer met bijbehorende letter. Vervang de letter “c” in [message] opbject door jou letter als deze afwijkt  en klik er op. Of verander de “c” in het [serial] object in jou letter.
  4. Optioneel: verhoog de baud rate van 9600 naar een hogere (bv max 115200). Verander dit ook in je arduino code!
  5. Klaar! Maar Letop! In de map “Max/Msp” staan nog 2 bestanden: asciimessage2max.mxb en max2asciimessage.mxbZorg dat deze twee altijd in de zelfde map staan als jou patch.
Een oudere versie van hoe de patch er uit ziet.

Een oudere versie van hoe de patch er uit ziet.

Special notes

Servo: We hebben 2 manieren om een servo aan te sturen. Standaard staat VarSpeedServo aan <VarSpeedServo.h> omdat deze het beste werkt en je de snelheid kan bepalen. Daarnaast is er ook de mogelijk om de arduino eigen te gebruiken  (<Servo.h>) , deze staat standaard uit.  Helaas kan je ze niet te gelijk gebruiken. Je moet één van de twee uitzetten door ze in comments te zetten (in de arduino code) – anders gaan de twee libarys vechten (<Servo.h> en <VarSpeedServo.h>).  Let er op dat de twee regels onder  // Include the (VarSpeed)Servo library aan/uit zet (door de “//” of “/*” “*/” te verwijderen/toe te voegen) en de betreffende case (S voor <Servo.h>  en V voor <VarSpeedServo.h>).

Wat me opviel was dat als je Max ondertussen data laat sturen, bv een ledje laad knipperen (metro), en daarna de servo aanstuurt met <Servo.h>, stuurt hij de servo aan tot er weer een puls naar het ledje gaat door de metro. Dus ‘ledje aan – je klik op servo draaien – ledje uit + stopt met servo draaien’. Dit resulteert er in dat hij de draai niet afmaakt. <VarSpeedServo.h> daar in tegen houd alle andere signalen tegen. Dus zolang de servo draait, blijft het ledje aan of uit. Tenzij je in case ‘v’ de ‘true’ in ‘false’ veranderd. Dan gedraagt hij het zelfde als met <Servo.h>

Stepper motor: Ook hier hebben we twee versies van, al kunnen deze wel naast elkaar staan in de code. Hier hoef je standaard niets aan te doen – tenzij je de pin nummers wilt veranderen. (Dit word in de toekomst regelbaar vanuit je seriële programma).  Als je meer dan 1 motor aan wilt sluiten moet je dat handmatig in de code bijvoegen. Dit vergt enige kennis van arduino code (maar in principe is het kopieer/plak werk en dan wat variabele aan passen).

> Steppermotor aansturen mbv de Easy Driver van sparkfun. We hebben hem aangesloten zolas het onderstaande schema. Op Bildr.org kan je meer info vinden hoe je hem moet aansluiten. Je kan zowel de hoeveelheid graden dat hij moet draaien, draai richting en de snelheid waarmee de motor draait.  Seriële data is bv. w z 50 90. Hier is de snelheid 50. Dit kan een waar de van 1 tot 100 zijn. Kan geen float zijn. “43” kan dus wel, maar “43,6” niet. De hoeveelheid graden die de motor draait is 90 rechtsom. Dit kan elke waarde zijn, zo is 1080 3x een heel rondje. Een negatieve waarde laat de mot0r de andere kant op draaien.

EasyDriver van Sparkfun.

Zo sluit je je easy driver aan. @Bilder.org

Zo sluit je je easy driver aan. @Bilder.org

Note van sparkfun: Do not connect or disconnect a motor while the driver is energized! This will cause permanent damage to the A3967 IC. (geloof me, dat liegen ze niet…..)

DIR gaat naar Pin 2 op je arduino, STEP naar pin 3.  Dit kan je veranderen in de arduino code.

> stepper moter aansturen dmv een transistor array (aantal transistors op een rij). Een voorbeeld hier van is de uln2003 stepper motor driver –  maar je kan ze ook zelf maken. We hebben de arduino code toegespits op de 28BYJ48 stepper motor. Gebruik je een andere? Dan kan het zijn dat je de aantal stappen moet veranderen in de arduino code.  Als je meer dan 1 motor aan wilt sluiten moet je dat handmatig in de code bijvoegen. Dit vergt enige kennis van arduino code (maar in principe is het kopieer/plak werk en dan wat variabele aan passen). Standaard sluit je de motor als volgend aan: in1 (blauw)  = pin 8, in2 (roze)= 10, in3 (geel)= 9, in4 (oranje) = 11.  (Rood naar de GND als je zelf de driver maakt). De kleuren zijn de draad kleuren van mijn 28BYJ48.

Een ULN2003 driver met een 28BYJ48 stepper motor.

Home made ULN 2003 driver, maar zo werkt de groene van hier naast/boven ook.