środa, 30 kwietnia 2014

STM32F429i-Disco

Dzisiaj chciałbym co nie co przybliżyć ten super zestawik. Jako że jestem w
posiadaniu tej płytki to coś należało by napisać na jej temat.
Generalnie wszystkie dane techniczne można znaleźć na stronie producenta
czyli ST, ale tutaj przybliżę też pewne cechy, aby było to wszystko pod ręką.

Na pokładzie naszej płytki możemy znaleźć:
- mikrokontroler STM32F429IT6 - procek posiada 2MB pamięci Flash,
   256 KB pamięci RAM o jest w obudowie LQFP144, Cortex-M4 ARM
- wbudowany programator/debugger ST-LINK/V2
- 2.4'' calowy wyświetlacz QVGA TFT z dotykowym panelem
- L3GD20 - trzy osiowy żyroskop
- dwie diody dla użytkownika (zielona, czerwona)
- dwa przyciski (reset, użytkownika)
- złącze USB OTG
- oraz wyprowadzone goldpiny z portów procka

A tak o to wygląda nasza płyteczka:)




Nasze programy będziemy pisali w środowisku CooCox - chociaż ten na razie
nie wspiera w pełni tej platformy jednak zastosujemy pewny trick, który nam
to umożliwi.
Warto nabyć tą płytkę chociażby ze względu na wyświetlacz, który posiada
panel dotykowy - np. będzie się można pokusić o zbudowanie pseudo tabletu:)

Przykładowy kod do mrugania diodami napiszemy w następnym odcinku.

wtorek, 29 kwietnia 2014

FRDM-KL46Z - płynna regulacja jasności diod za pomocą slidera

Jak pisałem w poprzednim odcinku wykorzystamy sobie slidera do płynnej regulacji
jasności naszych dwóch diod. W zależności w którą stronę będziemy paluchem
ślizgać po sliderze jedna z diod będzie się płynnie rozjaśniać a druga przyciemniać.
Generalnie przykład kodu jest nieznacznie rozbudowany w stosunku do poprzedniego
odcinka. Najważniejsze fragmenty kodu zawierają komentarz.

Kodzik:



 #include "mbed.h"
#include "SLCD.h"
#include "TSISensor.h"

SLCD slcd; //SegmentLCD

TSISensor slider; //Touch Slider
PwmOut rLED(LED_RED);       //PTE29
PwmOut gLED(LED_GREEN);

struct KL46_SENSOR_DATA {
    int   sw1State;
    int   sw3State;
    
    float   slider;
    float   light;

} sensorData;
#define sD sensorData


int main() {

 
    while (true) {
           
    
    slcd.DP(0, false); slcd.DP(1, false); slcd.DP(2, false); //wykasowanie kropek między segmentami
    sD.slider = slider.readPercentage();
           
    slcd.printf("%1.2f", slider.readPercentage()); //wysyłamy wartość slidera na nasz lcd
      
    if(sD.slider)   //sprawdzamy czy ktoś dotyka slidera
    {
        gLED = slider.readPercentage(); //pwm na diodę zieloną
        if(gLED >= 0.95) gLED = 1.0f;     
        rLED = 1.0f - slider.readPercentage(); //pwm na diodę czerowną
        if(rLED >=0.95)  rLED = 1.0f;  
    } 
         
    slcd.CharPosition = 0; //zapobięgnięcie skrolowania wyświetlacza 
    wait(0.01);
    
    }
}

 

Oraz filmik heh pokazujący efekt świetlny:)



Oczywiście jak zwykle życzę przyjemnej zabawy :)

FRDM - KL46Z - Slider & LCD


poniedziałek, 28 kwietnia 2014

Mruganie diodą + HelloWorld na FRDM-KL46Z

Hej!
Dzisiaj chciałbym pokazać jak za pomocą naszej płytki można mrugać diodą
oraz wysyłać coś na nasz napisany w C# terminal. Kod jest bardzo prosty
i nie wymaga za bardzo tłumaczenia. Toglowanie odbywa się w taki sposób, że w pętli
sprawdzamy stan naszego przycisku i jeśli wystąpi stan niski na buttonie
to włączamy diodkę i wysyłamy napis "HelloWorld" na terminal. A kiedy buttonik
puścimy diodka się wyłącza.


#include "mbed.h"

Serial serial(USBTX, USBRX); //OpenSDA Terminal
#define pf serial
DigitalIn  sw1(PTC3);



#define PRESS_ON  0
#define PRESS_OFF 1

#define LED_ON  0 //outON, 
#define LED_OFF 1 //outOFF,
DigitalOut gLED(LED_GREEN); //PTD5

int main() {
    
    DigitalOut led(LED_GREEN);
    sw1.mode(PullUp);

    serial.baud(115200);
    
    while (true) {
        
        if(sw1==PRESS_ON) //lewy przycisk sw1
        {
            gLED = LED_ON;
            
            pf.printf("Hello World!\r\n");
            wait(0.2);
        }
        else
            gLED = LED_OFF;
            }
}

a na terminalu oczywiście widnieje napis:
Życzę przyjemnej zabawy z diodkami:)

piątek, 25 kwietnia 2014

Speech - prosty program sterujący wybranymi funkcjami w PC

Witam!
 Ostatnio modne staję się sterowanie głosowe funkcjami w naszym PC-ie.
Poniekąd jest to bardzo wygodne, czasem nie chce nam się wpisywać cały czas
tej samej strony internetowej np: youtube w przeglądarce czy w windowsie 8 szukać
ukrytej opcji zamknięcia czy uśpienia komputera.
Dlatego też dla własnej wygody postanowiłem napisać prosty program, który ułatwi
mi to zadanie :).
Speech - jest to prosty programik, który ma zaimplementowane biblioteki speech z
.NET Frameworka, co z kolei umożliwia syntezę mowy.
Tutaj akurat trzeba podkreślić, że programiści Microsoftu potraktowali sprawę
po macoszemu i nie ma zaimplementowanych polskich słowników gramatycznych
- hmm generalnie jest tylko angielski (USA) przez co trzeba raczej wymawiać frazy
po angielsku. Nie mniej jednak program jest bardzo użyteczny. Modyfikując jedynie
kilka linijek kodu, każdy może program dostosować pod siebie :)


Przycisk "Start" uruchamia proces syntezy przechwytanego przez mikrofon głosu natomiast "Stopem" zatrzymujemy. Możemy również wydać komendę głosową "exit" co zaowocuje wyłączeniem programu.
W ramce obok wypisałem przykład komend, jakie wykorzystuje najczęściej:

- youtube - odpala stronę www.youtube.com
- google - odpala google :)
- antel -odpala forum atnel
- shutdown - powoduje zamknięcie systemu
- reboot - powoduje restart systemu
- sleep - usypianie PC
- hibernate - hibernacja PC
- exit - wyłączenie programu Speech

Czasem trzeba niektóre komendy powtórzyć wyraźnie i głośno nie mniej jednak zachęcam do rozbudowy
programu we własnym zakresie oraz testów:)

Kod:




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Speech.Recognition;
using System.Speech.Synthesis;
using System.Globalization;
using System.Runtime.InteropServices;

namespace Speach_test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
        }
        SpeechSynthesizer sSynth = new SpeechSynthesizer();
        PromptBuilder pBuilder = new PromptBuilder();
        SpeechRecognitionEngine sRecognize = new SpeechRecognitionEngine();

        
        private void Form1_Load(object sender, EventArgs e)
        {
            button2.Enabled = false;
        }
        
        private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;
            button2.Enabled = true;
            Choices sList = new Choices();
            sList.Add(new string[] { "shutdown", "sleep", "hibernate", "reboot", "youtube", "google","atnel","exit"});
            Grammar gr = new Grammar(new GrammarBuilder(sList));

            try
            {
                sRecognize.RequestRecognizerUpdate();
                sRecognize.LoadGrammar(gr);
                sRecognize.SpeechRecognized += sRecognize_SpeechRecognized;
                sRecognize.SetInputToDefaultAudioDevice();
                sRecognize.RecognizeAsync(RecognizeMode.Multiple);
            }
            catch
            {
                return;
            }
        }

        void sRecognize_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            //MessageBox.Show("Mowa rozpoznana: " + e.Result.Text.ToString());
            switch (e.Result.Text)
            { 
                case "youtube":
                    System.Diagnostics.Process.Start("http://www.youtube.com");
                    break;
                case "sleep":
                    Application.SetSuspendState(PowerState.Suspend, true, true);// usypianie kompa
                    break;
                case "google":
                    System.Diagnostics.Process.Start("http://www.google.pl");
                    break;
                case "shutdown":
                    System.Diagnostics.Process.Start("ShutDown", "/s /t 0");
                    break;
                case "reboot":
                    System.Diagnostics.Process.Start("Reboot", "/r /t 0");
                    break;
                case "hibernate":
                    Application.SetSuspendState(PowerState.Hibernate, false, false);
                    break;
                case "atnel":
                    System.Diagnostics.Process.Start("http://www.forum.atnel.pl");
                    break;
            }
            if (e.Result.Text == "exit")
            {
                Application.Exit();
            }
            else
            {
                textBox1.Text = textBox1.Text +" "+ e.Result.Text.ToString();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            button1.Enabled = true;
            button2.Enabled = false;
            sRecognize.RecognizeAsyncStop();
        }
        
    }
}


czwartek, 24 kwietnia 2014

eCompas FRDM-KL46Z + openGL

Hej!
Jako, że nasza płytka posiada magnetometr MAG3110 postanowiłem to wykorzystać i
powstał taki mały nie skomplikowany pseudo kompas w openGL. Narysowałem
trzy linie imitujące igłę kompasu mające wskazywać kierunki i na formatce wyświetlam sobie litery
N - północ oraz S - południe sygnalizujące położenie magnetometru względem biegunów
ziemskich.

Północ:
Południe:




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SharpGL;
using System.Globalization;

namespace SharpGLWinformsApplication1
{

    public partial class SharpGLForm : Form
    {

        public SharpGLForm()
        {

            InitializeComponent();
            serialPort1.Open();
        }
        string receive;
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            try
            {
                receive = serialPort1.ReadTo("\r\n");
                this.Invoke(new EventHandler(displayText));
            }
            catch
            {
                
            }
        }
       
        private string[] parse = new string[3];
        private void displayText(object sender, EventArgs e)
        {
            parse = receive.Split(',');
            textBox1.Text = receive;

        }



        private void openGLControl_OpenGLDraw(object sender, RenderEventArgs e)
        {
            OpenGL gl = openGLControl.OpenGL;           
            gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);            
            gl.LoadIdentity();

            
            if (receive != null)
            {
                gl.Rotate(1.0f, (float)Convert.ToInt32(float.Parse(receive, CultureInfo.InvariantCulture)), 0.0f);

                if ((float)Convert.ToInt32(float.Parse(receive, CultureInfo.InvariantCulture)) >= -5 && (float)Convert.ToInt32(float.Parse(receive, CultureInfo.InvariantCulture)) <= 5)
                {

                    label1.Text = "S";
                }
                else label1.Text = "";


                if ((float)Convert.ToInt32(float.Parse(receive, CultureInfo.InvariantCulture)) <= -175 || (float)Convert.ToInt32(float.Parse(receive, CultureInfo.InvariantCulture)) >= 175)
                {
                    label1.Text = "N";
                }
               

            }
            

            gl.Begin(OpenGL.GL_LINES);
            gl.Color(255.0f, 0.0f, 0.0f);
            gl.Vertex(0.0f, 0.0f, 0.0f);
            gl.Color(0.0f, .0f, 255.0f);
            gl.Vertex(1.0f, 1.0f, 1.0f);

            gl.Color(0.0f, 255.0f, 0.0f);
            gl.Vertex(1.0f, 1.0f, 1.0f);
            gl.Color(0.0f, 1.0f, 0.0f);
            gl.Vertex(0.0f, 1.0f, 0.0f);


            gl.Vertex(0.0f, 1.0f, 0.0f);
            gl.Color(0.0f, 200.0f, 100.0f);
            gl.Vertex(0.0f, 0.0f, 0.0f);                        
            gl.End();

            rotation += (float)numericUpDown1.Value;
        }



 
        private void openGLControl_OpenGLInitialized(object sender, EventArgs e)
        {
            
            OpenGL gl = openGLControl.OpenGL;

            
            gl.ClearColor(0, 0, 0, 0);
        }

 
        private void openGLControl_Resized(object sender, EventArgs e)
        {
            OpenGL gl = openGLControl.OpenGL;            
            gl.MatrixMode(OpenGL.GL_PROJECTION);            
            gl.LoadIdentity();            
            gl.Perspective(40.0f, (double)Width / (double)Height, 0.01, 100.0);
            gl.LookAt(0, 3, 1, 0, 0, 0, 0, 0, 1);            
            gl.MatrixMode(OpenGL.GL_MODELVIEW);
        }

        private float rotation = 0.0f;

        private void SharpGLForm_Load(object sender, EventArgs e)
        {

        }


        private void SharpGLForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            serialPort1.Dispose();
            Application.Exit();
        }
        
    }
}
Obsługa magnetometru:
#include "mbed.h"
#include "MMA8451Q.h"
#include "MAG3110.h"
#include "SLCD.h"
#include "TSISensor.h"
#include 


#include "USBHostMSD.h" //Lab3-MSd

define LED_ON  0 //outON, pwmON
#define LED_OFF 1 //outOFF,pwmOFF
DigitalOut gLED(LED_GREEN); //PTD5

#define rLEDperiod 150      //[ms]
PwmOut rLED(LED_RED);       //PTE29

#define PRESS_ON  0
#define PRESS_OFF 1
DigitalIn  sw1(PTC3);  //if(sw1) Release else Press
DigitalIn  sw3(PTC12); //while(sw3); wait for Press

#define MMA8451_I2C_ADDRESS (0x1d<<1 data-blogger-escaped--="" data-blogger-escaped-acc="" data-blogger-escaped-agnetometer="" data-blogger-escaped-analog-light="" data-blogger-escaped-analogin="" data-blogger-escaped-apacitive="" data-blogger-escaped-define="" data-blogger-escaped-input="" data-blogger-escaped-light="" data-blogger-escaped-mag3110="" data-blogger-escaped-mag="" data-blogger-escaped-mma8451_i2c_address="" data-blogger-escaped-mma8451q="" data-blogger-escaped-out="" data-blogger-escaped-pensda="" data-blogger-escaped-pf="" data-blogger-escaped-printf="" data-blogger-escaped-pte24="" data-blogger-escaped-segmentlcd="" data-blogger-escaped-serial="" data-blogger-escaped-slcd="" data-blogger-escaped-slider="" data-blogger-escaped-terminal="" data-blogger-escaped-touch="" data-blogger-escaped-tsisensor="" data-blogger-escaped-usb_osda="" data-blogger-escaped-usbrx=""> osda (lab1,2,3)

struct KL46_SENSOR_DATA {
    int   sw1State;
    int   sw3State;
    float   accValX;
    float   accValY;
    float   accValZ;
    
    float   slider;
    float   light;
    int     magValX;
    int     magValY;
    int     magValZ;
    
    float   magHeading;
} sensorData;
#define sD sensorData

void SLCD_blinking_msg_wait(char *slcd_msg1, char *slcd_msg2);

int MagCalibrationXY(void); //mag calib
int main(void)
{
    int mag_calib = 0;
    
    FILE* fp;

    //---- MAIN/Inits -----------------------------------------//
    
    sw1.mode(PullUp);
    sw3.mode(PullUp);
    
    gLED = LED_ON; //Green LED ON to indicate running/writing
    rLED = LED_OFF; //Red LED OFF
    rLED.period(rLEDperiod); //Red LED (rLED) tsi/accZ/mag
    
    //---- MAIN/Inits (Wait4SW1) -> Start! --------------------//   
    
    //wait for Press SW1 - e.g. for HID/CDC/MSD Windows install.
    //SLCD_blinking_msg_wait("   o","Helo"); //Helo (no usb);
    SLCD_blinking_msg_wait("   o","MSd ");//Lab1=Hid;2=cdc;3=Msd
    
    //---- MAIN/Inits Interface -------------------------------//
    
    usb_osda.baud(115200);
    usb_osda.printf("\n___________________________________\r\n");
    usb_osda.printf("\nFRDM-KL46Z_Lab\r\n \r\n I am a CDC serial port @OpenSDA/mUSB. Baud=115200 \r\n");
    
 
    while (!mag_calib) {
        pf.printf(" Press and release SW1 to calibrate eCompass.\r\n");
        SLCD_blinking_msg_wait("   o","CAL ");
        
        // Calibrate Magnetometer to eCompass
        pf.printf(" ... r o t a t e  the FRDM board in 3d/360° until [donE].\r\n");
        
        mag_calib = MagCalibrationXY(); //to wait untill calib or cancel!!! 
        
        if (mag_calib) {
            if (mag_calib == -1)
            {
                pf.printf(" [SKiP]! Calibration skipped!  ... See Accelerometer Z-axe.\r\n");
                SLCD_blinking_msg_wait("   o","SKiP"); //->acc
            } else {
                pf.printf(" [donE]! Calibration completed! ... Press and release SW1 to try eCompass.\r\n");  
                SLCD_blinking_msg_wait("   o","donE"); //->mag
            }
            break; //while (!mag_calib)
        } else {
            slcd.printf("erro");
            pf.printf("r\n Error Calib !!! try again !!!\r\n\r\n");
        } //repet calib
    }
    
    
    
    gLED = LED_OFF; //Inits are done

    
    while (1) {
        //disable all SLCD DPs
        slcd.DP(0, false); slcd.DP(1, false); slcd.DP(2, false);

        
        sD.sw1State = sw1; sD.sw3State = sw3;
        sD.accValX = acc.getAccX(); //accX[-1..1]->mouse (Lab1)
        sD.accValY = acc.getAccY(); //accY[-1..1]->mouse (Lab1)
        sD.accValZ = acc.getAccZ(); //accZ[-1..1]->rLED
        
        sD.slider = slider.readPercentage() * 100;
        sD.light = light;
        sD.magValX = mag.readVal(MAG_OUT_X_MSB);
        sD.magValY = mag.readVal(MAG_OUT_Y_MSB);
        sD.magValZ = mag.readVal(MAG_OUT_Z_MSB);
        
        sD.magHeading = mag.getHeading(); 
 
        pf.printf("%3f",sD.magHeading);
        
        pf.printf("\r\n");
        
       
        slcd.CharPosition=0; 
        slcd.printf("% 3.0f", sD.magHeading);
        
        wait(0.05); //wait 50ms
    }
}





//_____________________________________________________________//
//======== FUNC() =============================================//
//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯//

//Lab2add
void SLCD_blinking_msg_wait(char *slcd_msg1, char *slcd_msg2)
{
    char wait4sw1=0; //~500ms blinking

    //wait for Press SW1 - to start mag calibration
    while(sw1 == PRESS_ON); //wait for release
    while(sw1 == PRESS_OFF) { //wait for press
        if (++wait4sw1 < 150) //300ms
            slcd.printf(slcd_msg1);
        else //200ms
            slcd.printf(slcd_msg2);
        wait(0.002);
    }
    while(sw1 == PRESS_ON); //wait for release
}

//Lab3add
int MagCalibrationXY(void)
{
    int newX, tempXmax, tempXmin; int newY, tempYmax, tempYmin;
    int newZ, tempZmax, tempZmin;
    int delta_avg=0, delta_avg_min=0, delta_avg_max=0, delta_calib_limit=800;
    
    tempXmax = tempXmin = mag.readVal(MAG_OUT_X_MSB); //init X
    tempYmax = tempYmin = mag.readVal(MAG_OUT_Y_MSB); //init Y
    tempZmax = tempZmin = mag.readVal(MAG_OUT_Z_MSB); //init Z
    
    // Update min and max values until calPin asserted again
    while(sw1) {//wait for Press == manual calib stop
        newX = mag.readVal(MAG_OUT_X_MSB);
        newY = mag.readVal(MAG_OUT_Y_MSB);
        newZ = mag.readVal(MAG_OUT_Z_MSB);
        
        if (newX > tempXmax) tempXmax=newX;
        if (newX < tempXmin) tempXmin=newX; newX=tempXmax - tempXmin;
        if (newY > tempYmax) tempYmax=newY;
        if (newY < tempYmin) tempYmin=newY; newY=tempYmax - tempYmin;
        if (newZ > tempZmax) tempZmax=newZ;
        if (newZ < tempZmin) tempZmin=newZ; newZ=tempZmax - tempZmin;       
        
        delta_avg = (newX + newY + newZ);
        
        //delta is too high? -> error, try new calib!!!
        if (delta_avg > 5 * delta_calib_limit) {delta_avg=0; break;}
        
        //div3 with error +0.8 pct
        delta_avg = (21*(newX + newY + newZ))>>6;

        //calib ok for delat ~800-1200 (~80-120uT)
        if (delta_avg > delta_calib_limit){
            delta_avg_min = delta_avg - (delta_avg>>2);
            delta_avg_max = delta_avg + (delta_avg>>1);
            if (delta_avg_min < newX && delta_avg_max > newX
            &&  delta_avg_min < newY && delta_avg_max > newY
            &&  delta_avg_min < newZ && delta_avg_max > newZ) break;
        }
        
        //show calib progress 0->100%
        slcd.printf("C%3.0f", (float)delta_avg/delta_calib_limit*100);
    }
    
    if (sw1 == PRESS_ON || delta_avg ) {
        mag.setCalibration( tempXmin, tempXmax, tempYmin, tempYmax );
        if (sw1 == PRESS_ON) return -1; //==-1 ..user skip
        return delta_avg; //>0 .. done, ok calib
    }
    return 0; //==0 .. error, no calib
}
Tutaj jeszcze filmik pokazujący działanie eKompasu w praktyce:

 Przyjemnej zabawy :)

Prosty terminal debugowy



Witajcie!

Jako, że prowadzę ciąg artykułów o zestawie FRDM-KL46Z nieodłącznym narzędziem
dla nas będzie prosty terminal do wizualizacji danych z naszej płytki.
W sieci można znaleźć wiele różnych programów typu terminal ale ja jak zawsze
wole swoje narzędzie - zresztą człowiek zawsze się nauczy czegoś nowego :)

Terminal, który przedstawiam nie jest jakimś tam super programem ma jedynie za
 zadanie wyświetlenie naszych wyników. Oczywiście narzędzie to przyda nam się
w przyszłości gdzie na pewno jeszcze zajdzie potrzeba użycia go nie koniecznie z
opisywaną płytką.



Nasz terminal zapamiętuje ostatnie ustawienia portu COM oraz prędkości BaudRate
co jest fajne ponieważ nie trzeba za każdym razem rozwijać comboboxów i wybierać
portu jak i prędkości.

Myślę, że z czasem zostaną dodane inne funkcje na potrzeby opisywanych programów.

Poniżej kod w c#:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace serial_receive
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();                     


            button1.Text = "Otwórz";
            button1.BackColor = Color.Green;

            string[] porty = SerialPort.GetPortNames();

            foreach (var ports in porty)
            {
                comboBox1.Items.Add(ports);
            }
            comboBox1.Text = Properties.Settings.Default.port;
            comboBox2.Text = Properties.Settings.Default.baud;
        }

        private string rxString;
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            rxString = serialPort1.ReadExisting(); 
            this.Invoke(new EventHandler(displayText)); 
        }
        private void displayText(object o, EventArgs e)
        {
            
            richTextBox1.AppendText(rxString); 
        }



        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
            }
            else
            {
                serialPort1.PortName = comboBox1.SelectedItem.ToString();
            }
            
        }
        int flaga = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            flaga++;
            if (flaga == 1)
            {
                button1.Text = "Zamknij";
                button1.BackColor = Color.Red;
                try
                {
                    serialPort1.Open();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                
            }
            if (flaga != 1)
            {
                button1.Text = "Otwórz";
                button1.BackColor = Color.Green;
                try
                {
                    serialPort1.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                flaga = 0;
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            Properties.Settings.Default.port = comboBox1.SelectedItem.ToString();
            Properties.Settings.Default.baud = comboBox2.Text;
            Properties.Settings.Default.Save();
            if (serialPort1.IsOpen) serialPort1.Close();
        }
    }
}

Program można pobrać tutaj:
link

wtorek, 22 kwietnia 2014

FRDM-KL46Z + OpenGL

Jako, że w ostatnim arcie pisałem, że pobawimy się trochę naszą płytką tak też dotrzymuję
słowa i przedstawiam taką małą zajawkę, która kiedyś posłuży do większego projektu.
Na tą chwilę jeszcze nie będę udostępniał kodu ponieważ muszę w nim zrobić mały
porządek ale za to przedstawię krótki film prezentujący działanie naszego fridomka
z biblioteką OpenGL w której możemy rysować różną grafikę.


Projekt się będzie rozwijał i z czasem może coś ciekawego powstanie.


A tutaj jeszcze jeden film pokazujący jak można manipulować tekstem:)


czwartek, 17 kwietnia 2014

FRDM-KL46Z- Board z segmentowym LCD

Wpadła mi dzisiaj w łapki płytka ewaluacyjna FRDM-KL46Z i trzeba coś
na jej temat napisać. Jako, że byłem na szkoleniu prowadzonym przez firmę
Freescale uczestnicy próbowali swoich siła na tej właśnie płytce ewaluacyjnej.
Na temat specyfikacji technicznej nie będę się zbytnio rozpisywał każdy kto
jest zainteresowany tym maleństwem znajdzie dane techniczne na stronie
 producenta - pokaże w skrócie kilka najważniejszych zdjęć a w następnej
części przedstawię środowisko w jakim można napisać swój program testowy.

Pudełeczko może i skromne ale za to płytka oraz jej możliwości robią wrażenie:)




Na fotce powyżej możemy zobaczyć jakie peryferia producent umieścił na bordzie.

Płyteczka idealnie się nadaję do budowy quadrokoptera dzięki umieszczonemu akcelerometrowi oraz
kompasowi.
Bardzo fajnym rozwiązaniem ze strony Freescala było umieszczenie wyświetlacza segmentowego,
na którym można wyświetlać wartości z magnetometru czy akcelerometru.
Płytka również posiada dotykowy slider, na który od razu znalazłem zastosowanie w projekcie, który
w wolnym czasie zrealizuje - mianowicie będzie to płynna regulacja MagicLedów w oświetleniu domowym.

Jak wspomniałem wyżej w następnej części pomrugamy diodami oraz skorzystamy z gotowych bibliotek
do rozpędzenia naszej płyteczki. Do tego napiszemy sobie prosty terminal do wizualizacji danych z akcelerometru:).

Oczywiście chciałbym podziękować firmie Freescale za płytkę FRDM-KL46Z:)