continue reading hover preload topbar hover preload widget hover preload

Quadcopter render

Categories: Quadcopter  |   Comments(2)

Na een tijdje met Google Sketchup en de Indigo renderer voor Sketchup heb zitten spelen is het volgende eruit gekomen. Onthoudt de term Quadcopter, hier gaan meer posts over komen ;-) .

Quadcopter render

595 shift register aansturen met de Velleman k8055

Categories: .NET, Elektronica, Geen categorie  |   Comments(30)

Een tijdje terug ben ik begonnen met experimenteren met een USB-interface van de firma Velleman.

Velleman K8055

Met deze interface-kaart heb je met behulp van je computer de beschikking over 8 digitale uitgangen, 5 digitale ingangen, 2 analoge ingangen en 2 analoge uitgangen. Bij de kaart wordt een DLL-file meegeleverd. Deze file fungeert als een API van de interface. Door bepaalde functies van de DLL aan te roepen kun je de hardware aanspreken vanaf je computer. Dit kan met elke programmeertaal die overweg kan met een DLL-file.

 

Met behulp van C# ben ik wat gaan experimenteren. Dit lukte vrij snel en vrij aardig. Maar ik kwam op het punt dat ik een 7-segment LED display wilde gaan aansturen. Je zult hiervoor 7 uitgangen van de K8055 nodig hebben om al de segmenten aan te kunnen sturen. Om toch nog wat uitgangen over te houden kun je de uitgangen uitbreiden door gebruik te maken van een shiftregister. Dit is een chip die meerdere uitgangen heeft en met maar een paar (ingangs)-signalen aangestuurd kan worden. Ik heb het bekende 595-shiftregister gebruikt. Dit is een chip waar je serieel informatie instuurt, dus bitje voor bitje en in één keer alle uitgangen die je hebt aangezet kunt uitsturen (parallel).

74HC595 Shift Register

Het principe van een schuifregister is als volgt: Door één van de pinnen hoog of juist laag te maken wordt er een 1 of een 0 in het register gezet. Door vervolgens de “clock-pin” een puls te geven wordt de waarde in het register geschoven. Dit kun je blijven doen tot dat het register vol is. De gebruikte 595-chip is een 8-bit chip en heeft dus ruimte voor 8 waarden. De ingeklokte waarden kun je nu naar de uitgangen sturen door de “latch-pin”. Snapte je deze alinea niet? ;-) hier is een simulatie te vinden van deze chip die (voor mij in ieder geval) een hoop duidelijk heeft gemaakt.

Het resultaat van dit kleine projectje is te zien in onderstaande video.

 

 

Door middel van een simpele UI kun je een karakter kiezen wat op het display getoond moet worden. Verder is er de mogelijkheid om alle mogelijke karakters achter elkaar op het display te tonen.

Screenshot C# applicatie

Hieronder is de C#-code te vinden die communiceert met de DLL-file om de K8055 aan te sturen. Om de hele C#-solution te downloaden, klik hier. Om dit geheel werkend te krijgen is de DLL-file nodig die is meegeleverd bij de interface-kaart. Deze is te downloaden van de website van Velleman. De DLL-file dient in de windows/System32 map geplaatst te worden.


using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Reflection;
using System.Windows.Forms;
using System.Timers;
using System.Runtime.InteropServices;
using System.Threading;namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
[Flags]
enum segments
{
top         = 0x02,
topLeft     = 0x01,
topRight    = 0x04,
center      = 0x08,
bottomLeft  = 0x80,
bottomRight = 0x20,
bottom      = 0x40,
dot         = 0x10
}enum segmentChars : byte
{
zero = segments.topLeft | segments.top | segments.topRight | segments.bottomRight | segments.bottom | segments.bottomLeft,
one = segments.topRight | segments.bottomRight,
two = segments.top | segments.topRight | segments.center | segments.bottomLeft | segments.bottom,
three = segments.top | segments.topRight | segments.center | segments.bottomRight | segments.bottom,
four = segments.topLeft | segments.topRight | segments.center | segments.bottomRight,
five = segments.topLeft | segments.top | segments.center | segments.bottomRight | segments.bottom,
six = segments.topLeft | segments.top | segments.center | segments.bottomRight | segments.bottom | segments.bottomLeft,
seven = segments.top | segments.topRight | segments.bottomRight,
eight = segments.topLeft | segments.top | segments.topRight | segments.center | segments.bottomRight | segments.bottom | segments.bottomLeft,
nine = segments.topLeft | segments.top | segments.topRight | segments.center | segments.bottomRight | segments.bottom,
dot = segments.dot,
}int pin_data = 1;
const int pin_latch = 2;
const int pin_clock = 3;</p>
// Following wraps K8055D.DLL
// (K8055D_C.DLL is required for .net DLL, as used in K8055_test_D)
// *** have not checked if K8055D_C.DLL can be used here as well ***
public sealed class api // DLL Wrapper
{
#region API Declares</p>
[DllImport("c://Windows/System32/k8055d.dll")]
public static extern int OpenDevice(int devNumber);

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern void CloseDevice();

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern int ReadAnalogChannel(int Channel);

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern void ReadAllAnalog(ref int Data1, ref int Data2);

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern void OutputAnalogChannel(int Channel, int Data);

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern void OutputAllAnalog(int Data1, int Data2);

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern void ClearAnalogChannel(int Channel);

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern void SetAllAnalog();

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern void ClearAllAnalog();

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern void SetAnalogChannel(int Channel);

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern void WriteAllDigital(int Data);

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern void ClearDigitalChannel(int Channel);

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern void ClearAllDigital();

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern void SetDigitalChannel(int Channel);

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern void SetAllDigital();

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern bool ReadDigitalChannel(int Channel);

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern int ReadAllDigital();

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern int ReadCounter(int CounterNr);

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern void ResetCounter(int CounterNr);

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern void SetCounterDebounceTime(int CounterNr, int DebounceTime);

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern void Version();

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern int SearchDevices();

[DllImport("c://Windows/System32/k8055d.dll")]
public static extern int SetCurrentDevice(int lngCardAddress);

#endregion
}

private void shiftBit(bool value)
{
//Kijk of het nodig is om de data-pin op de "aan-stand"te zetten
if (value)
{
api.SetDigitalChannel(pin_data);
}

//Geef de clock-pin een schop
api.SetDigitalChannel(pin_clock);
api.ClearDigitalChannel(pin_clock);

//Zet de data-pin weer terug op de "uit stand"
api.ClearDigitalChannel(pin_data);
}

private void shiftOut()
{
//Geef latch-pulse
api.SetDigitalChannel(pin_latch);
api.ClearDigitalChannel(pin_latch);
}

public Form1()
{
InitializeComponent();

//Stel de K8055 goed in
api.CloseDevice(); //Eerst alle verbindingen sluiten
api.OpenDevice(3); //Open interfacekaart
}

public void shiftOutByte(Byte shiftByte)
{
//Maak een bit-array van de opgegeven byte
byte[] value = { shiftByte };
BitArray shiftBitArray = new BitArray(value);

//Loop door alle bits en zet deze in het register
foreach(bool shiftByteBit in shiftBitArray)
{
Console.WriteLine(shiftByteBit);
shiftBit(shiftByteBit);
}
//Latch het register
shiftOut();
}

private void showButton_Click(object sender, EventArgs e)
{
//Kijk of het veld is ingevuld
if (characterBox.Text == "")
{
//Geen karakter opgegeven, geef een waarschuwing
MessageBox.Show("Geef een karakter op om te tonen.");
}
else
{
string teken = characterBox.Text;
switch(teken)
{
case "0": shiftOutByte((Byte)segmentChars.zero); break;
case "1": shiftOutByte((Byte)segmentChars.one); break;
case "2": shiftOutByte((Byte)segmentChars.two); break;
case "3": shiftOutByte((Byte)segmentChars.three); break;
case "4": shiftOutByte((Byte)segmentChars.four); break;
case "5": shiftOutByte((Byte)segmentChars.five); break;
case "6": shiftOutByte((Byte)segmentChars.six); break;
case "7": shiftOutByte((Byte)segmentChars.seven); break;
case "8": shiftOutByte((Byte)segmentChars.eight); break;
case "9": shiftOutByte((Byte)segmentChars.nine); break;
case ".": shiftOutByte((Byte)segmentChars.dot); break;

default:
MessageBox.Show("Onbekend karakter.");
break;
}
}
}

private void Form1_Load(object sender, EventArgs e)
{

}

private void loopButton_Click(object sender, EventArgs e)
{
//Maak display eerst helemaal leeg
shiftOutByte(0x00);
//Loop door alle karakters in de enum
foreach (byte val in Enum.GetValues(typeof(segmentChars)))
{
shiftOutByte(val);
//Wacht 1 seconde voordat het volgende karakter getoond wordt.
Thread.Sleep(1000);
}

}

}
}

Project previews

Categories: Elektronica, Quadcopter, Touchscreen  |   No Comments

Hieronder alvast een paar video’s om de spanning wat op te voeren…

Quadcopter 1

 

Quadcopter 2

 

Touchscreen

Welkom

Categories: Geen categorie  |   Comments(4)

Welkom op mijn nieuwe weblog. In het verleden ben ik al vaker bezig geweest met een weblog. Toen kwam ik tot de conclusie dat ik vrij weinig dingen te vertellen had die de moeite waard waren om te melden aan de buitenwereld.

Ik zeg niet dat dat nu anders is ;-) . Ik zit wel met een paar mooie projectjes in mijn hoofd die misschien interessant kunnen gaan worden.

 

De onderwerpen op dit weblog zullen divers zijn. Het zal gaan over webdevelopment, softwaredevelopment of elektronica.

 

Het onderdeel softwaredevelopment zal vooral gaan over .NET. Omdat ik voor mijn nieuwe baan hiermee zal moeten gaan werken zal ik dit onder de knie moeten krijgen. Interessante technieken die ik tegen kom zal ik hier proberen te posten.

 

Elektronica is een hobby waar ik vroegâh al mee bezig was. Vanaf de middelbare school ben ik hier echter mee gestopt en verder gegaan met andere hobby’s. Nu wil ik dit weer gaan oppakken. In een volgende post zal ik wat projectjes laten zien die me weer enthousiast hebben gemaakt.

 

Ik heb totaal geen verwachtingen van dit weblog, maar ik hoor graag jullie reacties wat jullie ervan vinden. Voor mij zal het in ieder geval een leuke manier zijn om wat interessante technieken te delen.

 

Veel leesplezier!