Interface and application programming
Task:
write an application that interfaces with an input &/or output device
Description:
For the interface assignment I want to start working on an interface with sliders, being able to connect the sliders to the SoftPWM in my code. When the softPWM works I could theoretically create 16581375 colours with the use of a RGB led. I want this interface to output the values through a serial connection so it can wirelessly transfer its data to my lamp.
What did I do:
- Play around with processing
- Check out processing.js
- Connect Softserial with processing
- Design a interface
- Software PWM
Play around with processing
Processing is in my opinion a really powerful and neat language. You can easily do some fun stuff and with a basic knowledge of programming you can get fun applications.
void setup() {
size(730, 400);
smooth();
}
void draw(){
float s = dist(mouseX, mouseY, pmouseX, pmouseY) +random(1, 10);
noStroke();
fill(random(0,255), random(0,255), random(0,255), random(0,255));
ellipse(mouseX, mouseY, s, s);
stroke(255);
point(mouseX, mouseY);
}
void setup() {
size(730, 400);
smooth();
}
void draw(){
float s = dist(mouseX, mouseY, pmouseX, pmouseY) +1;
noStroke();
fill(0,50);
ellipse(mouseX, mouseY, s, s);
stroke(255);
point(mouseX, mouseY);
}
Blade diagonal;
void setup(){
size(730,400);
diagonal = new Blade (30, 60);
}
void draw (){
diagonal.grow();
}
void mouseMoved(){
diagonal.seed(mouseX, mouseY);
}
class Blade{
float x, y;
Blade(int xpos, int ypos){
x = xpos;
y = ypos;
}
void seed(int xpos, int ypos){
x = xpos;
y = ypos;
}
void grow(){
x += random(2.5, 1);
y -= 5.0;
point(x, y);
}
}
Check out processing.js
Processing.js is a really handy tool for inserting your processing files onto the web. The user just loads in the javascript and inserts the PDE file like this:
<canvas data-processing-sources="processing/processing_fun2.pde"></canvas>
Connect Softserial with processing:
After all the processing fun it was time to work on my project. I found this tutorial on 'Sparkfun', this manual is very helpful to learn about connecting processing to your Arduino code. With the use of this method I was able to switch a LED on and off that I connected to my Arduino. This was really easy to get to work. Now I needed to combine this with my previous code to control a LED wirelessly.
Design an interface:
With the use of Illustrator I designed the interface you see in the pictures below. For now it will be to much to build the interface but it will be nice if I will be able to do this in the future. Based on this interface I did do some tryouts with sliders. I found this processing library that I would like to combine with my code. With this library you can easily create different knobs, sliders, buttons etc.
Software PWM:
As example for the softwarePWM I took the code from the digiBlink because my familiarity with this program. Earlier during this course I was able to use this script combined with a python script to output all the colours. Now this should be combined with my code for the interface and wireless connection.
My PWM code
#include <SPI85.h>
#include <Mirf.h>
#include <MirfHardwareSpi85Driver.h>
#include <nRF24L01.h>
#define CE 7
#define CSN 3
// ATMEL ATTINY84 / ARDUINO
//
// +-\/-+
// VCC 1| |14 GND
// SerialTx (D 0) PB0 2| |13 AREF (D 10)
// (D 1) PB1 3| |12 PA1 (D 9)
// RESET PB3 4| |11 PA2 (D 8)
// PWM INT0 (D 2) PB2 5| |10 PA3 (D 7) CE
// SS/CSN (D 3) PA7 6| |9 PA4 (D 6) USCK
// USI-DI (D 4) PA6 7| |8 PA5 (D 5) USI-DO
// +----+
int redVal = 0;
int greenVal = 0;
int blueVal = 0;
int next = 0;
int ledPinRed = 10;
int ledPinGreen = 8;
int ledPinBlue = 1;
int bufferSize = 0;
char buffer[32] = "";
unsigned int counter = 0;
uint8_t nodeID = 0;
void setup(){
Serial.begin( 9600 ); // for tiny_debug_serial
Mirf.cePin = CE;
Mirf.csnPin = CSN;
Mirf.spi = &MirfHardwareSpi85;
Mirf.init();
pinMode(ledPinRed, OUTPUT);
pinMode(ledPinGreen, OUTPUT);
pinMode(ledPinBlue, OUTPUT);
Mirf.setRADDR((byte *)"serv1");
Mirf.payload = sizeof(char);
Mirf.config();
digitalWrite(ledPinRed, HIGH);
digitalWrite(ledPinGreen, HIGH);
digitalWrite(ledPinBlue, HIGH);
Serial.println("Listening...");
blueVal = 250;
}
void loop(){
byte data[Mirf.payload];
if(!Mirf.isSending() && Mirf.dataReady()){
Serial.println("Got packet");
Mirf.getData(data);
blueVal = (int) data[0];
Mirf.send(data);
}
setBlue();
}
void setBlue(){
if(blueVal == 0){
digitalWrite(ledPinBlue,HIGH);
return;
}
else if(blueVal == 255){
digitalWrite(ledPinBlue,LOW);
return;
}
// On period
for (int x=0;x<blueVal;x++){
digitalWrite(ledPinBlue,LOW);
}
// Off period
for(int x=0;x<(255-blueVal);x++){
digitalWrite(ledPinBlue,HIGH);
}
}