Virtual 3D Device Port – SU15-21-Virtuele Potmeter
Nu we de basis onder de knie hebben, kunnen we eens kijken of we een praktijk voorbeeld kunnen gebruiken, bijvoorbeeld een potmeter.
Eerst gaan de een potmeter aansluiten op de arduino volgens onderstaand schema:
De Arduino programmeren
Om een object in SketchUp SketchyPhysics te laten bewegen kunnen we een script schrijven voor de potmeter op de Arduino dat van 0.00 naar 1.00 gaat in (potmeter helemaal naar links t/m potmeter helemaal naar rechts.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// configureer hier de potmeter pin, deze sluiten we hier // aan op de analoge poort 2 van de arduino: A2 int potmeter = A2; float uitgangwaarde; void setup() { // zet seriele poort aan op 9600 baud. Serial.begin(9600); } void loop() { // Lees de analoge ingang uit. int sensorValue = analogRead(potmeter); // De analoge poort gaat van 0 naar 1023 door MAP te gebruiken. // maakt de arduino een verhoudig tussen 0 en 1000. uitgangwaarde = map(sensorValue, 0, 1023, 0, 1000); // Deel de uitgangwaarde door 1000 voor een getal tussen de 0.00 en 1.00 // print potmeter waarde via seriele monitor. Serial.println(uitgangwaarde / 1000); // even wachten voor een nieuwe loop. delay(50); } |
1) Open de Arduino IDE en upload het bovenstaande script naar de Arduino, als je de seriële monitor opent krijg je deze output te zien:
3D potmeter
Op de Sketchup 3D Warehouse website zijn veel modellen te downloaden, mijn oog is gevallen op dit potmeter model:
Physics toevoegen aan de 3D potmeter
1) Draai de potmeter 90 graden met de klok mee.
2) Vergroot de potmeter 10x en plaats deze van de assen af.
3) In het schermpje met ‘Joints’ selecteer ‘servo’, en trek deze vanuit het midden van de knop naar het midden onder de knop.
4) Van het hoofdschermpje van SketchyPhysics selecteer de ‘joint connector’
5) Klik op de servo.
6) Houd de (linker) CTRL knop ingedruk (er verschijnt een plusje +) en selecteer de knop, hier komt een groene rand omheen.
Seriële data laden in SketchUp SketchyPhysics
Nu de Arduino de getallen stuurt via de seriële poort moeten we deze opvangen in SketchUp SketchyPhysics, dit doen we met een Python script en de plugin PySerial, in onderstaand script heb ik commentaar regels toegevoegd:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# DomoticX Virtual 3D Device Port SU15 interface. # Wat moet er gebeuren bij het starten van de simulatie? onstart{ compoortopties = ["Serial Port:", "Baudrate:"] # Standaard waarden!, deze kun je zelf aanpassen! standaard = ["COM8", "9600"] # Lijst met baudrates voor de dropdownlijst in het menu. baudratelijst = ["", "4800|9600|14400|19200|28800|38400|57600|115200"] # Geef het dialoogvenster weer voor vraag naar gegevens. serialsettings = UI.inputbox(compoortopties, standaard, baudratelijst, "Serial port settings:") if serialsettings != FALSE # Haal de instellingen uit het diagloogvenster en koppel deze aan een variabele. $comport = serialsettings[0] $baudrate = serialsettings[1].to_i begin # Open de seriele poort. @serial = Serial.new($comport, $baudrate) rescue RubySerial::Exception => e # Sluit de seriele poort als deze open staat. @serial.close if @serial # Reset/stop de simulatie. MSketchyPhysics3::SketchyPhysicsClient.physicsReset # Geef een bericht dat de seriele poort niet is gevonden. UI.messagebox("Seriele poort niet gevonden!") end else # Reset/stop de simulatie. MSketchyPhysics3::SketchyPhysicsClient.physicsReset end } # Wat moet er gebeuren tijdens de simulatie? ontick{ # Sluit het 'control panel' venster bij het starten van de simulatie. MSketchyPhysics3.closeControlPanel if frame == 1 # Lees de data van de seriele poort in. $serialdata = @serial.read(1024) # Geef de gegevens weer aan de linker zijde (log). logLine("COM poort: " + $comport.to_s) logLine("BAUD rate: " + $baudrate.to_s) logLine("Seriele data: " + $serialdata.to_s) logLine("") logLine("") logLine("") logLine("") logLine("") } # Wat moet er gebeuren als de de simulatie stopt? onend{ # Sluit de seriele poort als deze open staat. @serial.close if @serial } |
Waar moet dit script geplaatst worden?
1) Klik op de UI (User Interface) knop.
2) Klik op de knop.
3) Vink onderaan op ‘scripted’ om een script toe te voegen, daar plaats je het bovenstaande script in.
De Servo instellen
Nu we de data inlezen in de (Ruby) variabele $serialdata, moet deze ook naar de servo gestuurd worden.
1) Klik op de servo.
2) Voer bij ‘Controller’ in [variabele].to_f ,in dit geval:
$serialdata.to_f
Ps. .to_f betekend in Ruby “TO FLOAT”.
Overige instellingen
1) als je nu de simulatie start, dan zie je dat het onderste deel naar beneden valt, ….zet deze op ‘ignore’:
2) Zet X-ray uit via Topmenu > view> Face Style > X-ray:
3) Om het figuur van de servo niet meer te zien, ga naar Topmenu > Window > Layers, en vink ‘visible’ uit bij ‘Physics joints’.
4) Om de knop te bewerken klik op de knop en dan rechter muisknop > ‘Edit Component’.
Teken een driehoek zoals onder aangegeven, met de ‘paint bucket’ kun je deze een kleur geven:
5) Voor een meer realistische potmeter is de draaihoek 270 graden, dus die kunnen we aanpassen:
Alles in actie
1) Sluit de Arduino aan met bovenstaand Arduino script geladen (pas eventueel de COM poort aan in het Python script).
2) Druk op de “play” knop om de simulatie te starten.
Nu zal de potmeterknop zich gaan bewegen, zoals je ook aan de echte knop draait!
Je kan het controleren door in het TOP menu van SketchUp naar Window > Ruby console te gaan, daar zie je de binnengekomen seriële gegevens.
Hoe werkt het?
Dit werkt nu via een seriele verbinding tussen de Arduino en de computer, de arduino stuurt getallen (FLOAT) tussen 0.00 en 1.00.
In Sketchup SketchyPhysics is:
– 0.00 de status van het object opgegeven bij de MIN waarde (bijvoorbeeld -135 graden)
– 1.00 de status van het object opgegeven bij de MAX waarde (bijvoorbeeld 135 graden)
Daaruit volgt dat tussen 0.00 en 1.00, 270 graden zit, omdat sketchup met stapjes van 0.01 werkt zijn er 100 stapjes dus 2,7 graden per stapje.
- SketchyPhysics - SU15-33-LED aan-uit schakelen (sketchup).skp.7z 225,84 kb
- SketchyPhysics - SU15-33-LED aan-uit schakelen (ruby script).rb.7z 1,09 kb
- SketchyPhysics - SU15-33-LED aan-uit schakelen (arduino script).ino.7z 0,69 kb
- SketchyPhysics - SU15-32-RGB LED aansturen (sketchup).skp.7z 61,30 kb
- SketchyPhysics - SU15-32-RGB LED aansturen (ruby-python scripts).ino.7z 1,76 kb
- SketchyPhysics - SU15-32-RGB LED aansturen (arduino script).ino.7z 0,80 kb
- SketchyPhysics - SU15-31-Servo aansturen (SG90) (arduino script).ino.7z 0,82 kb
- SketchyPhysics - SU15-30-Hendel status voorbeeld compleet naar Arduino (ruby script).rb.7z 1,70 kb
- Sketchyphysics - SU15-30-Hendel status naar Arduino (sketchup).skp.7z 31,52 kb
- SketchyPhysics - SU15-23-Gyroscoopmeter (GY-521) (arduino script).ino.7z 1,02 kb
- SketchyPhysics - SU15-22-Accelerometer (ADXL345) (sketchup).skp.7z 74,49 kb
- SketchyPhysics - SU15-22-Accelerometer (ADXL345) (ruby script).rb.7z 1,14 kb
- SketchyPhysics - SU15-22-Accelerometer (ADXL345) (arduino script).ino.7z 1,50 kb
- SketchyPhysics - SU15-21-Virtuele Potmeter (sketchup).skp.7z 51,62 kb
- SketchyPhysics - SU15-21-Virtuele Potmeter (ruby-python script).rb.7z 1,03 kb
- SketchyPhysics - SU15-21-Virtuele Potmeter (arduino script).ino.7z 0,60 kb
- SketchyPhysics - SU15-21-Potmeter orgineel model (sketchup).skp.7z 91,66 kb
- Sketchyphysics - SU15-20-Communicatie naar SU (sketchup).skp.7z 22,37 kb
- SketchyPhysics - SU15-20-Communicatie naar SU (ruby script).rb.7z 1,03 kb
- SketchyPhysics - SU15-20-Communicatie naar SU (arduino script).ino.7z 0,33 kb
- SketchyPhysics - SU15-12-Waarde uitlezen van object voorbeeld van forum (sketchup).7z 71,97 kb
- SketchyPhysics - SU15-10-Basis oefening (sketchup).skp.7z 19,25 kb
- SketchyPhysics - SU14&15 - Library FFI+RubySerial.7z 167,31 kb