Έλεγχος RGB LED με Unity + Arduino

Δημιουργούμε μία εφαρμογή και ελέγχουμε μέσω αυτής το κύκλωμα με Arduino όπου αλλάζουμε τα χρώματα από ένα LED RGB.

Χρησιμοποιώντας την αναπτυξιακή πλακέτα Arduino σε συνδυασμό με την game engine Unity μπορείτε να φτιάξετε πολλές και ενδιαφέρουσες εφαρμογές. Σε αυτό το άρθρο – video θα σας παρουσιάσουμε μία η οποία ελπίζουμε να σας αρέσει.

Game Engine unity

Η game engine Unity, είναι μία “μηχανή” με την οποία μπορείτε να φτιάξετε παιχνίδια αλλά και εφαρμογές. Η γλώσσα προγραμματισμού είναι η C# ενώ το περιβάλλον διεπαφής είναι αρκετά εύκολο για έναν αρχάριο χρήστη.

Η μηχανή προσφέρει τη δυνατότητα να δημιουργήσετε τόσο 3D εφαρμογές και παιχνίδια όσο και 2d.

Το project που δημιουργήσαμε θα μπορούσαμε να το υλοποιήσουμε σε άλλη πλατφόρμα ανάπτυξης λογισμικού ενδεχομένως πιο κατάλληλη αλλά επιλέξαμε την Unity καθώς πιστεύω προσωπικά ότι είναι μία καλή ευκαιρία να την χρησιμοποιήσετε όσοι δεν την έχετε δουλέψει ποτέ ξανά.

Το project




Αυτό το οποίο θα υλοποιήσουμε είναι ένα πρόγραμμα με το οποίο θα ελέγχουμε μέσω της unity ένα RGB LED. Το τι σημαίνει RGB LED για όσους και όσες είστε αρχάριοι/ες θα το εξηγήσουμε παρακάτω στο άρθρο.

Δείτε την προοπτική που μπορεί να έχει η υλοποίηση ενός τέτοιου project.

Μπορείτε να συνδέσετε μία συσκευή η οποία θα αλληλεπιδρά με το περιβάλλον μέσω αισθητήρων και στην συνέχεια θα μπορείτε να διαβάζετε τα δεδομένα στον υπολογιστή σας και να ελέγχετε τη ροή μίας εφαρμογής.

Το concept μπορεί να λειτουργήσει και αμφίδρομα.

Μέσω διαφόρων χειρισμών από μία εφαρμογή λογισμικού να μπορείτε να χειρίζεστε συσκευές όπως για παράδειγμα το άνοιγμα ή κλείσιμο ρολών μίας πόρτας ή γκαραζόπορτας, κλπ.

Το κύκλωμα

Χρησιμοποιήσαμε το Fritzing για να σχεδιάσουμε την παρακάτω εικόνα που αποτυπώνει το κύκλωμα και την συνδεσμολογία των καλωδίων. Για την κατασκευή μας, χρειαζόμαστε τα παρακάτω υλικά:

  1. Arduino / Genuino Uno /Mega
  2. 3x resistors (αντιστάσεις) 220Ohm
  3. 1x RGB LED common cathode (κοινής καθόδου)
  4. Jumper wires
  5. Breadbroad to connect all

Η συνδεσμολογία του κυκλώματος είναι πολύ απλή, συνδέουμε τις ανόδους για τα τρία χρώματα του RGB LED στις εισόδους 7,8,9 οι οποίες είναι PWM. Οι αντιστάσεις μπαίνουν ανάμεσα της ανόδου του LED και της εισόδου του Arduino mega για προστασία, ενώ η κάθοδος του LED συνδέεται στο GND.

unity send data to arduino

Στο βίντεο δεν χρησιμοποιώ αντιστάσεις των 220Ω αλλά των 270Ω και παρόλο που έχω μεγαλύτερη τιμή αντίστασης η φωτεινότητα είναι ικανοποιητική στην πλήρη ένταση.

Το LED RGB

τα led η αλλιώς φωτοδίοδοι συνήθως έχουν δύο ακροδέκτες. Έναν για την άνοδο(+) και έναν για την κάθοδο(-). Όταν διαπερνώνται από ρεύμα με σωστή πολικότητα καθώς λειτουργούν με συνεχή τάση, φέγγουν.

Υπάρχει μία ειδική κατηγορία φωτοδίοδων, τα RGB τα οποία έχουν στην κεφαλή τους 3 φωτοδιόδους με διαφορετικά χρώματα (Κόκκινο, Πράσινο και Μπλε – από εκεί βγαίνει το όνομα RGB=Red, Green, Blue).

Μπορούμε να δώσουμε τάση σε ένα οποιοδήποτε από τα τρία χρώματα και μέσω της κοινής καθόδου(-) να κλείσουμε το κύκλωμα να ανάβουμε ένα LED.

Οι πιθανοί συνδυασμοί χρώματος που μπορούμε να πετύχουμε είναι 16.7 εκατομμύρια χρώματα (αποχρώσεις) το οποίο προκύπτει από τον συνδυασμό τιμών που μπορεί να πάρουν τα τρία χρώματα (0-256) 256*256*256

Στην παραπάνω εικόνα απεικονίζονται από αριστερά τρία LED με διαφορετικό χρώμα. Προσέξτε ότι εσωτερικά στην κεφαλή έχει δύο μεταλλικά ελάσματα. Το μεγαλύτερο είναι η κάθοδος (-) ενώ ο ακροδέκτης της καθόδου είναι ο κοντύτερος.

Για να έχουμε τρία διαφορετικά χρώματα θα πρέπει να χρησιμοποιήσουμε τρία διαφορετικά LED ή ένα LED RGB.

Η φιλοσοφία του project

Για το project χρειάστηκε να συνδέσουμε το arduino mega 2560 μέσω usb καλωδίου στον υπολογιστή. Αυτό σημαίνει αυτόματα ότι μπορεί να υπάρξει σειριακή επικοινωνία μεταξύ του υπολογιστή και του arduino.

Για την εφαρμογή επιλέξαμε την game engine unity. Αν “πιάσετε” το νόημα της επικοινωνίας σίγουρα μπορείτε να υλοποιήσετε το ίδιο project με οποιαδήποτε εφαρμογή και γλώσσα προγραμματισμού.

Δημιουργήσαμε ένα UI στην unity με τρία slider τα οποία αναπαριστούν τα τρία διαφορετικού χρώματος LED.

Στην συνέχεια δημιουργήσαμε 3 point light με διαφορετικό χρώμα, ώστε να βλέπουμε την απεικόνιση στην οθόνη όπως την παρακάτω εικόνα και συνδέσαμε τα slider ώστε να χειρίζονται την ένταση των point light (σύροντας το slider αυξομειώνουμε το Intensity του point light)

 

Ο κώδικας που γράψαμε χρειάζεται μία προεργασία στις ρυθμίσεις του Project γιατί πρέπει να ενσωματώσουμε την βιβλιοθήκη ΙΟ.Ports.

Για να λειτουργήσει όμως αυτή η βιβλιοθήκη θα πρέπει να κάνουμε τα παρακάτω βήματα:

Ο κώδικας στην Unity

Θα χρειαστούμε δύο script. Το ένα θα είναι υπεύθυνο για την επικοινωνία με την σειριακή θύρα ενώ το άλλο θα είναι υπεύθυνο για την αποστολή δεδομένων.

Το script communication.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO.Ports;

public class communication : MonoBehaviour
{
  public SerialPort stream = new SerialPort("COM9", 115200);
  void Start ()
  {
    stream.Open();
  }
}

Αυτό που συμβαίνει στο παραπάνω script είναι να δημιουργούμε μία σύνδεση στην σειριακή θύρα COM9, θα πρέπει να αντικαταστήσετε το COM9 με την θύρα που αντιστοιχεί στην δική σας σύνδεση.

Παρακάτω εξηγούμε πως εντοπίζετε την θύρα ή απλώς παρακολουθήστε το βίντεο.

Το script θα το κάνουμε attach στην main camera την οποία μετονομάσαμε σε camera (δεν υπήρχε κάποιος λόγος, απλώς μου ήταν ευκολότερο να το θυμάμαι.)

Το δεύτερο script ονομάζεται Handle Light και περιέχει:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class HandleLight : MonoBehaviour

 {
    private int Multiplier = 128;
    private float sliderValue;
    GameObject Connection;
    private void Start()
    {
        Connection = GameObject.Find("Camera");
    }

public void OnLightChange(Light light)
    {
        sliderValue = this.gameObject.GetComponent<Slider>().value;
        light.intensity = sliderValue / Multiplier;
        if (light.name == "redPin")
        {
            Connection.GetComponent<communication>().stream.WriteLine("7" + sliderValue.ToString());
        }
        else if (light.name=="greenPin")
        {
            Connection.GetComponent<communication>().stream.WriteLine("8" + sliderValue.ToString());
        }
        else
        {
            Connection.GetComponent<communication>().stream.WriteLine("9" + sliderValue.ToString());
        }
        
        Debug.Log(sliderValue.ToString());
        //communication.stream.WriteLine(light.name+light.intensity);
    }
}

Αξίζει να σημειώσουμε ότι η εντολή που στέλνει τα δεδομένα στο arduino είναι για κάθε διαφορετικό χρώμα η

Connection.GetComponent<communication>().stream.WriteLine(“7” + sliderValue.ToString());

όπου χρησιμοποιούμε το αντικείμενο σειριακής επικοινωνίας που δημιουργήσαμε στο script communication και στη συνέχεια με την stream.WriteLine (string), στέλνουμε τα δεδομένα σε αλφαριθμητική μορφή. Σημειώστε ότι το arduino αυτό που δέχεται στην σειριακή του θύρα είναι byte.

Το script handle light θα το κάνουμε attach σε κάθε slider και στη συνέχεια θα χρησιμοποιήσουμε τον listener της Unity έτσι ώστε να χειριζόμαστε τις αλλαγές στους slider. (βλ. video)

Λήψη δεδομένων από το arduino

Για το arduino IDE, το σημαντικότερο που πρέπει να προσέξουμε είναι να συνδέσουμε σύμφωνα με το κύκλωμα τα εξαρτήματά μας και να δούμε ποια σειριακή θύρα (COM) χρησιμοποιείται όταν συνδέουμε το καλώδιο στον Η/Υ.

Για να το κάνουμε αυτό θα πρέπει να πριν συνδέσουμε το καλώδιο να δούμε από την εφαρμογή IDE arduino στα εργαλεία –> θύρα ποια θύρα είναι διαθέσιμη.

Αφού συνδέσουμε το arduino στην usb θύρα του υπολογιστή θα προστεθεί μία επιπλέον θύρα στα εργαλεία-> θύρα.

Ότι θύρα δούμε εκεί θα την βάλουμε ως όρισμα στο script communication

public SerialPort stream = new SerialPort(“η θύρα σας”, 115200);

Επίσης είναι σημαντικό να προσέξουμε ότι το arduino αυτό που διαβάζει είναι byte!

έτσι λοιπόν θα πρέπει να προβλέψουμε στον κώδικά μας να διαβάσουμε σειριακά το κάθε byte, να το μετατρέψουμε σε χαρακτήρα και να το εισάγουμε σε μία αλφαριθμητική εφαρμογή (string).

Στη συνέχεια το string μπορούμε να το δώσουμε ως όρισμα ακόμα και αν το όρισμα είναι αριθμητικό με την εντολή .toInt().

Ο κώδικας arduino

Μπορείτε να κατεβάσετε το αρχείο .ino από rgb .ino

int redPin= 7;
int greenPin = 8;
int bluePin = 9;
String valueFromSerial;
void setup() 
{
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  Serial.begin(115200);
}

void loop()
{
  while (Serial.available() > 0) 
  {
    int inChar = Serial.read();

    if (isDigit(inChar))
    {
      valueFromSerial += (char)inChar;
    }
    if (inChar == '\n') 
    {
      analogWrite(valueFromSerial.substring(0,1).toInt(),valueFromSerial.substring(1,3).toInt());
      valueFromSerial = "";
    }
  } 
}

Η επεξήγηση του κώδικα αναλύεται στο βίντεο. Συνοπτικά αυτό που συμβαίνει ότι πως τα byte διαβάζονται ένα προς ένα.

Αν είναι αριθμοί, προσαρτώνται με την μορφή χαρακτήρα σε μία μεταβλητή string και στη συνέχεια χρησιμοποιούμε την μεταβλητή αυτή ως αριθμό με την χρήση valueFromSerial.toInt()

και τέλος, για να φωτίσουμε το RGB LED χρησιμοποιούμε την analogWrite (x,y) η οποία συντάσσεται,

analogWrite(αριθμός pin, τιμή εξόδου)


TIP: Ο κώδικας που θα γράψετε στο arduino είναι case sensitive όπως στο visual studio.

Το κακό όμως με το περιβάλλον arduino είναι ότι δεν έχετε τόσο λεπτομερή ενημέρωση για το τι δεν πάει καλά. Προσέξτε τις λεπτομέρειες.

Οκτώβριος 13, 2018

0 Απαντήσεις στο "Έλεγχος RGB LED με Unity + Arduino"

    Αφήστε ένα μήνυμα

    Η ηλ. διεύθυνση σας δεν δημοσιεύεται. Τα υποχρεωτικά πεδία σημειώνονται με *

    Σχεδιασμός © GetCert. Με επιφύλαξη παντός δικαιώματος.

    Αυτό είναι ένα δοκιμαστικό κατάστημα για δοκιμαστικούς σκοπούς — καμία παραγγελία δεν θα ολοκληρωθεί. Απόρριψη