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.
środa, 30 kwietnia 2014
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:
Oraz filmik heh pokazujący efekt świetlny:)
Oczywiście jak zwykle życzę przyjemnej zabawy :)
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 :)
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.
Życzę przyjemnej zabawy z diodkami:)
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 :)
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:
Przyjemnej zabawy :)
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" #includeTutaj 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:)
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:)
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:)
Subskrybuj:
Posty (Atom)