Virtual 3D Device Port – SU15-32-RGB LED aansturen
Het vorige hoofdstuk (30 – communicatie naar Arduino) liet zien hoe je van SketchUp kan communiceren via de seriële poort naar de Arduino, we gaan daar nu een RGB LED mee aansturen.
De kunst is om dit keer de RGB waarden te sturen en uit te lezen door de arduino, dwz 3 standen van iedere kleur.
RGB LED aansluiten
Sluit een RGB LED aan volgens onderstaand schema:
LET OP: GEBRUIK DE PWM PINNEN 9, 10 en 11 (ipv 11,12 en 13)
Upload de volgende code naar de Arduino om de RGB led te bedienen via de seriële poort:
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 |
String readString; // Configureer de pinnen van de LED // LET OP: Gebruik wel pinnen die PWM ondersteunen! int rodePin = 9; int groenePin = 10; int blauwePin = 11; void setup() { // Start de seriel poort op 9600 baud. Serial.begin(9600); } void loop() { while (Serial.available()) { // Lees 1 byte van de seriele buffer. char c = Serial.read(); // Plaats de ingelezen byte achter de rest (om een string te maken). readString += c; } if (readString.length() >9) { // Lees de waarden in vanuit seriele poort, maak er een getal van (toInt). // Ps. het eerste karakter is een dummy ivm werking Python in SketchUp int rood = readString.substring(0, 3).toInt(); int groen = readString.substring(3, 6).toInt(); int blauw = readString.substring(6, 9).toInt(); // maak van 0 t/m 100 een verhoudig tussen 0 en 255. int roodmap = map(rood, 0, 100, 0, 255); int groenmap = map(groen, 0, 100, 0, 255); int blauwmap = map(blauw, 0, 100, 0, 255); // Schrijf de waardne naar de PWM uitgangen. analogWrite(rodePin, roodmap); analogWrite(groenePin, groenmap); analogWrite(blauwePin, blauwmap); // Maak de buffer weer leeg. readString = ""; } } |
De RGB LED testen
Open de Arduino monitor en voer een getal in:
Byte 1-3: een getal 001 t/m 100 voor de rode kleur.
Byte 4-6: een getal 001 t/m 100 voor de groene kleur.
Byte 7-9: een getal 001 t/m 100 voor de blauwe kleur.
Voorbeelden:
00000000 = alles uit
10000000 = rood
00010000 = groen
00000100 = blauw
100000100 = paars
100100100 = alles aan
Sketchup en RGB waarden
In sketchup heb ik 3 sliders gemaakt die de rood, groen en blauw waarden representeren:
Achter elke slider zit een script om de waarden van die desbetreffende slider te achterhalen, een getal tussen de 0.00 en 1.00, met een aanpassing is deze waarde 000 t/m 100!
Voorbeeld van de rode slider:
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 59 |
onStart { # Find connected slider @slide_parent = nil @slider = nil @joint_name = nil parent_joints = this.group.get_attribute("SPOBJ", "parentJoints").to_a parent_joints.each { |jname| if jname =~ /slider|piston|spring|corkscrew/i @joint_name = jname break end } next unless @joint_name # Find slider associated with joint name Sketchup.active_model.entities.each { |e| next unless e.is_a?(Sketchup::Group) || e.is_a?(Sketchup::ComponentInstance) if e.get_attribute('SPJOINT', 'name', '') == @joint_name @slider = e else found = false e.entities.each { |ec| if ec.is_a?(Sketchup::Group) && ec.get_attribute('SPJOINT', 'name', '') == @joint_name @slider_parent = e @slider = ec found = true break end } break if found end } next unless @slider # Get min/max data associated with a slider slider_min = @slider.get_attribute('SPJOINT', 'min', 0) slider_max = @slider.get_attribute('SPJOINT', 'max', 0) @slider_range = (slider_max - slider_min).to_f } onUpdate { if @slider # Calculate object position and ratio on slider. pt = this.group.transformation.origin if @slider_parent tra = @slider_parent.transformation * @slider.transformation else tra = @slider.transformation end pt.transform!(tra.inverse) pos = pt.z ratio = @slider_range.zero? ? 0 : pos / @slider_range ratio = ratio - 0.06 ratio = 1.00 if ratio > 1.00 ratio = 0.00 if ratio < 0.00 $sliderr = "%03d" % (ratio * 100).round end } onEnd { } |
Bij de groene en blauwe slider kun je de zelfde code gebruiken, er hoeft maar 1 regel aangepast te worden:
voor groen:
$sliderg = "%03d" % (ratio * 100).round
voor blauw:
$sliderb = "%03d" % (ratio * 100).round
Dan is het de kunst om deze gegevens te verzamelen, weer te geven en via de seriële poort te verzenden, je kan dat doen in het script van de “basis plaat”:
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 59 |
# DomoticX Virtual 3D Device Port SU15 interface. # Wat moet er gebeuren bij het starten van de simulatie? onstart{ $fill = 1 compoortopties = ["Seriele poort:", "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, "Seriele poort instellingen:") 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 } onUpdate { # Sluit het 'control panel' venster bij het starten van de simulatie. MSketchyPhysics3.closeControlPanel if frame == 1 # Geef de gegevens weer aan de linker zijde (log). logLine("COM poort: " + $comport.to_s) logLine("BAUD rate: " + $baudrate.to_s) logLine("") logLine("Waarde rood: " + $sliderr.to_s) logLine("Waarde groen: " + $sliderg.to_s) logLine("Waarde blauw: " + $sliderb.to_s) logLine("") logLine("Seriele data: " + $sliderr.to_s + $sliderg.to_s + $sliderb.to_s) logLine("") logLine("") # Schrijf de data weg naar de seriele poort (incl. newline) @serial.write($sliderr.to_s + $sliderg.to_s + $sliderb.to_s + "\n") } # Wat moet er gebeuren als de de simulatie stopt? onend{ # Sluit de seriele poort als deze open staat. @serial.close if @serial } |
Zodra je de arduino hebt aangesloten en de poort hebt geconfigureerd kan je met behulp van de schuiven de kleuren van de RGB LED bedienen, tevens zie je de informatie aan de linkerkant van het scherm:
Hoe werkt het?
Dit werkt nu via een seriële verbinding tussen de computer en de Arduino , de computer stuurt getallen tussen 000 en 100 en zijn altijd 3 cijfers (cijfer 5 is dan 005)
Voor de kleuren RGB worden deze waarden achter elkaar gezet, bijvoorbeeld 100100100, omdat je niet met een 0 kan beginnen in python etc., zetten we voor het gegenereerde getal een 1, dat geeft dan (voor alle kleuren aan) 1100100100, dit eerste getal wordt door de arduino code overgeslagen.
Door de MAP functie toe te passen in de arduino code kan jet eenvoudig van een getal 000 t/m 100 een verdeling maken van 0 t/m 255.
In Sketchup SketchyPhysics is:
– 000 de status van het object opgegeven bij de MIN waarde
– 100 de status van het object opgegeven bij de MAX waarde
Daaruit volgt dat tussen 0.00 en 1.00, 180 graden zit, omdat sketchup met stapjes van 0.01 werkt zijn er 100 stapjes dus 1,8 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