2014 m. lapkričio 26 d., trečiadienis

Programa RGB LED valdymui per UART

Straipsnyje SPALVOS! arba RGB LED valdymas rašiau, kaip prijungiau RGB šviestukus prie mikrovaldiklio. Jei trumpai - mikrovaldikliui siunčiami trys baitai per UART (nuoseklųjį prievadą) su RGB spalvos kodu. Mikrovaldiklis pagal tą kodą pakoreguoja PWM nustatymus, taip pakeisdamas LED spalvą.
Pastaruoju metu po truputį pradedu dirbti su Visual Studio Express 2013 For Windows Desktop - bandau prisipratinti Visual C# (skaityti si šarp) programavimo kalbą. Panorėjau pasirašyti programėlę, kuri prieš tai aprašytam projektui siunčia spalvos kodą. Parašyta programėlė nebus labai daug naudojama, gal tik bandymams ir testavimui.




Naudojimas:

Pirmiausia reikia pasirinkti norimą prievadą iš pateiktų. Programa tikrina visus aktyvius prievadus sistemoje programos paleidimo metu, todėl jei, pavyzdžiui, USB-RS232 keitiklis prijungtas programai jau dirbant - programą reikės paleisti iš naujo.
Mygtukas "Init 0xFF" skirtas vieno baito siuntimui per pasirinktą prievadą - kadangi mikrovaldiklyje nėra jokios apsaugos nuo neteisingo gautų baitų kiekio, kaskart siųsti reikia tiksliai tris baitus su kodu numatyta tvarka. Jeigu prieš įjungiant programą mikrovaldiklis bus gavęs, tarkim, vieną baitą su kodu, reikės keletą kartų paspausti "Init" mygtuką. Apie sėkmingą inicializaciją galima spręsti iš užsidegusios maksimalios baltos spalvos.
Jeigu judinant vienos spalvos slankiklį valdoma ne ta spalva - greičiausiai bus neteisinga inicializacija.
Mygtukas "Reset" - kodų nunulinimas ir kodo 0,0,0 nusiuntimas į mikrovaldiklį.

Kodas

Pateikiu kodą. Jis šiek tiek pakomentuotas, bet bendrai ten nėra nieko sudėtingo - aš tai supratau :)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace sendserial
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();            
        }
 
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            send(this);
        }

        private void trackBar2_Scroll(object sender, EventArgs e)
        {
            send(this);
        }

        private void trackBar3_Scroll(object sender, EventArgs e)
        {
            send(this);
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            // reset - spalvos kodo nustatymas minimumui ir kodo nusiuntimas 
            trackBar1.Value = trackBar1.Minimum;
            trackBar2.Value = trackBar2.Minimum;
            trackBar3.Value = trackBar3.Minimum;
            send(this);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // vieno baito siuntimas - inicializacija
            byte[] init = new byte[1];
            init[0] = 255;
            serialPort1.Write(init, 0, 1);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            // prievado uždarymas
            serialPort1.Close();
            btInit.Enabled = false;
            btClose.Enabled = false;
            comboBox1.Enabled = true;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            // prievado uždarymas išjungiant programą
            serialPort1.Close();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // aktyvių prievadų sąrašas
            string[] ports = SerialPort.GetPortNames();
            //sudaromas "drop down" pasirinkimas
            foreach (string item in ports)
            {
                comboBox1.Items.Add(item);
            }
        }


        private void comboBox1_TextChanged(object sender, EventArgs e)
        {
            // prievado pasirinkimas
            serialPort1.Encoding = System.Text.Encoding.GetEncoding(1252);
            try
            {
                serialPort1.PortName = comboBox1.SelectedItem.ToString();
                serialPort1.Open();
            }
            catch
            {
                // klaida
                MessageBox.Show("Neteisingas pasirinkimas", "Klaida", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            // atidarius prievadą ijungiami mygtukai, isjungiamas prievado pasirinkimas
            btClose.Enabled = true;
            btInit.Enabled = true;
            comboBox1.Enabled = false;
        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            System.Diagnostics.Process.Start("http://www.andriusgrigaliunas.lt/elektronika/22-spalvos-arba-rgb-led-valdymas");
        }

        private void send(object sender)
        {
            // paimamas RGB reiksmes
            int r = trackBar1.Value;
            int g = trackBar2.Value;
            int b = trackBar3.Value;

            // nustatoma langelio spalva
            pictureBox1.BackColor = Color.FromArgb(r, g, b); // lango spalva
            
            //parodomas RGB kodas dešimtainiu pavidalu
            tbR.Text = r.ToString();
            tbG.Text = g.ToString();
            tbB.Text = b.ToString();

            //parodomas RGB kodas HEX
            tbXR.Text = String.Format("0x{0:X}", r);
            tbXG.Text = String.Format("0x{0:X}", g);
            tbXB.Text = String.Format("0x{0:X}", b);

            //kuriamas trijų baitų masyvas
            byte[] buff = new byte[3];
            buff[2] = Convert.ToByte(r);
            buff[1] = Convert.ToByte(g);
            buff[0] = Convert.ToByte(b);

            //jeigu prievadas atidarytas - siunčiamas masyvas
            if (serialPort1.IsOpen) serialPort1.Write(buff, 0, 3);
        }

    }
}

Komentarų nėra:

Rašyti komentarą