Etch-a-Sketch - w/Arduino & bearbetning
I grund och botten är vad jag har denna:
En Arduino Duemilenova som är inrymt i en gammal bandet Säkerhetsfack. Arduinoen har 2 potentiometrar fäst vid den. En representerar x-axeln och den andra y-axeln koordinater. Jag limmade lite rött VVS värden handtag till krukorna. Som en vänder krukor, går produktionen till analoga stift 0 och 1. Detta mappas till ett värde mellan 0 - 1023 för x- och y-koordinater.
Sedan skickas det som en seriell ström till den bärbara datorn som har en bearbetning skiss kör. Fysiskt finns det en USB-kabel ansluter Arduino och den bärbara datorn.
Denna skiss kartor 0-1023 till en position på skärmen och tomter en poäng där.
MEN saker är inte så enkelt för detta projekt.
Jag la 3 växlar till Arduino
1. - att tillåta ritningen skall äga rum. Genom att vrida detta off, kan man flytta den punkt där ritning börjar. Skisser kan separeras.
2. att rensa skärmen. Måste vara försiktig när du slår denna växel som det kommer att radera skärmen.
3. för att möjliggöra en förändring av färg. En tabell över färgval kommer upp. Genom att trycka på rätt knapp på tangentbordet, kan man ändra färg.
Var och en av dessa växlar skickar en unik karaktär i den seriella strömmen när de aktiveras.
Bearbetning skissen också ser ut för dessa tecken och reagerar därefter.
Också lekte jag med skärmstorlek för min laptop som orsakade några kod förändringar.
Koden har jag använt är nedan: första Arduino koden och sedan bearbetning koden. Både Arduino och Processinmg kod började med en kopia från någon annan som jag erkänner i kommentarerna. Ardiuno är ganska enkel med krukorna kommer att analoga stift 0 och 1 och varje switch går till en digital pin, antingen 3,5 eller 7.
Bearbetning koden är kraftigt modifierad av mig att få färger alternativ.
Arduino:
/** Etch-a-Sketch_wswitches
*
* Ett enkelt program att läsa två potentiometrar ansluten till analoga 0 och 1, tolka dem som ett ordnat par (x, y)
* och skicka dem via seriell till datorn
*
* baserat på grafen: http://www.arduino.cc/en/Tutorial/Graph
* 7/2011 - uppdaterad av cdubois
*/
#include < Stdio.h >
för krukor
int xCoord;
int yCoord;
char coords [10].
för växlar
variabler för input pin och styra LED
input 7 är att rensa skärmen
ingång 3 är att börja rita igen
ingång 5 är att ändra färg
int digitalInput3 = 3; Rita
int digitalInput5 = 5; ändra färg
int digitalInput7 = 7. klart
int LEDpin = 13.
variabel för att lagra värdet
int value3 = "0";
int value5 = "0";
int värde7 = "0";
void setup()
{
deklarera pin lägen
pinMode(digitalInput3,OUTPUT);
pinMode(digitalInput5,OUTPUT);
pinMode(digitalInput7,OUTPUT);
pinMode(LEDpin,OUTPUT);
Serial.BEGIN(9600);
}
void loop()
{
läsa av värdet på digital ingång
value3 = digitalRead(3);
skriva detta värde till kontroll LED stift
digitalWrite(LEDpin,value3);
Växla till Rita kontrolleras
om value6 är hög då skicka bokstaven "Y" annat send "N"
Serial.Print(value3);
om (value3) {
Serial.Print ("Y");
}
annat
{
Serial.Print "N,".
}
switch för att ändra färg kontrolleras
om value6 är hög då skicka bokstaven "E" annat send "N"
value5 = digitalRead(5);
om (value5) {
Serial.Print "E,".
}
annat
{
Serial.Print "N,".
}
värde7 = digitalRead(7);
switch att rensa skärmen kontrolleras
Serial.Print (värde7);
om (värde7) {
Serial.Print ("C");
}
annat
{
Serial.Print ("L");
}
xCoord = analogRead(0);
yCoord = analogRead(1);
sprintf (coords, "%d, %d", xCoord, yCoord);
Serial.println(coords);
Delay(5);
}
--------------------------------------------------------
--------------------------------------------------------
Bearbetning av kod
Etch-a-Sketch10
av Trevor Shannon
//
utifrån diagrammet
av David A. Mellis
ändrat av cdubois 2011-7
import processing.serial.*;
Seriell port;
Sträng buff = "";
String buff1 = "";
String buff2 = "";
String buff0 = "";
String clearScreen = "NO";
String stopDraw = "NO";
String newColor = "NO";
Sträng moveit = "NO";
String stopit = "NO";
Sträng firsttime = "Ja";
char c = 'H'; test för clearing
char d = 'H'; test för ritning
int x = 0;
int y = 0;
int oldx = 0;
int oldy = 0;
int en = 0;
heltal index = 0;
int NEWLINE = 10;
Lagra de senaste 10 värden fick så vi kan diagram dem.
int [] valuesx = nya int [10].
int [] valuesy = nya int [10].
variabler för färg
färg backg = färg (0, 0, 0);
färg rader = color(348,90,90);
void setup()
{
size(1023,512);
frameRate(10);
Port = ny följetong (här, "COM5", 9600);
Om du vet namnet på den port som används av Arduino styrelsen, du
kan ange det direkt så här.
Port = ny följetong (här, "COM1", 9600);
Background(backg);
}
// ----------------------------------------------------------
// ------------------------------------------------------------
void draw()
{
Drawlines();
movecursor();
selectcol();
checkswitches();
samtidigt (port.available() > 0)
{
serialEvent(port.read());
}
}
// ----------------------------------------------------------
Funktioner
// =========================================================
// ===========================================================
void selectcol()
{
om (newColor == "Ja") {
PFont teckensnitt;
Font = loadFont("Serif.plain-16.vlw");
textFont(font);
Fill(255,255,255);
text ("Välj en färg", 25, 25);
Fill(348,90,90);
text ("röd - tryck R", 25, 45);
Fill(237,151,12);
text ("Orange - tryck på O", 25, 65);
Fill(236,237,12);
text ("Gula - tryck Y", 25, 85);
Fill(12,237,28);
text ("Grön - tryck på G", 25, 105);
Fill(12,47,237);
text ("Blå - tryck B", 25, 125);
}
annat {
PFont teckensnitt;
Font = loadFont("Serif.plain-16.vlw");
textFont(font);
Fill(0,0,0);
text ("Välj en färg", 25, 25);
text ("röd - tryck R", 25, 45);
text ("Orange - tryck på O", 25, 65);
text ("Gula - tryck Y", 25, 85);
text ("Grön - tryck på G", 25, 105);
text ("Blå - tryck B", 25, 125);
}
}
// ============================================================
// ============================================================
// ============================================================
// ============================================================
// ============================================================
// ============================================================
nu har vänt krukor så vill rita linjer
void drawlines() {
om (stopit == "Nej") {
för (int jag = 0; jag < 9; i ++) {
stroke(lines);
strokeWeight(4);
Smooth();
Point(x,y);
linje (1023 - valuesx [i], 512 - valuesy [i], 1023-valuesx [jag + 1], 512 - valuesy [jag + 1]);
}
}
}
// ===============================================================
// ==============================================================
void serialEvent(int serial)
{
om (serial! = NEWLINE) {
Lagra alla tecken på raden.
buff += char(serial);
}
annat {
I slutet av varje rad markeras av två tecken, en vagn
återvändande och en ny rad. Vi är här eftersom vi har fått en ny rad,
men vi måste fortfarande remsor av vagnretur.
buff = buff.substring (0, buff.length()-1);
String [] lista = split (buff, ',');
läsa strängen
Om knappen klar skärm var nere, kommer att ett "C" vara i
4. teckenpositionen
char c = buff.charAt(4);
om inte längre vill rita, en "N" i första position
char d = buff.charAt(0);
om vill radera, ett "E" kommer att vara i 2: a röding position
char e = buff.charAt(2);
buff1 = lista [3].
buff2 = lista [4].
har sett en N så måste sluta ritning
om (d == 'N') {
stopDraw = "Ja";
}
annat
{
stopDraw = "NO";
}
Rensa skärmen
har sett en C så måste rensa så snart som möjligt
om (c == "C") {
clearScreen = "Ja";
}
annat
{
clearScreen = "NO";
}
ändra färger
har sett ett E så behöva lägga text i hörnet
och vänta för val av
om (e == "E") {
newColor = "Ja";
}
annat
{
newColor = "NO";
}
Tolka sträng till ett heltal. Vi delar med 4 eftersom
analoga ingångar gå från 0 till 1023 medan färgerna i bearbetning
bara gå från 0 till 255.
x = Integer.parseInt (buff1) / 1;
y = Integer.parseInt (buff2) / 2;
println(x);
println(y);
Rensa värdet i "buff"
buff = "";
skapa en array med tio punkter för linjen
för (int jag = 0; jag < 9; i ++)
{
valuesx [i] = valuesx [jag + 1];
valuesy [i] = valuesy [jag + 1];
}
Lägga till de mottagna värdet i arrayen.
valuesx [9] = x;
valuesy [9] = y;
}
}
// ================================================
// -------------------------------------------------
void movecursor()
{
vill flytta till annan plats
så vill flytta punkt men vill att det ska försvinna som det rör sig
om ((stopit == "Ja") & & (moveit == "Ja")) {
Radera gamla punkt
IF(a >0) {
stroke(backg);
punkt (oldx, oldy);
}
för (int jag = 0; jag < 9; i ++) {
stroke(255,255,255);
strokeWeight(4);
punkt (1023 - x, 512 - y);
Spara plats att raderas nästa gång
//
oldx = 1023 - x;
oldy = 512 - y;
en = a + 1;
}
}
// ================================================
// -------------------------------------------------
void checkswitches()
{
nu är det dags att testa switch ändringar
om ((stopDraw == "Ja") & & (clearScreen == "Ja")) {
stopit = "Ja";
Background(0);
}
Kunde få här om stopDraw är påslagen men inte clearScreen
dvs bara vill flytta den positioneringen utan ritning
om ((stopDraw == "Ja") & & (clearScreen == "Nej")) {
stopit = "Ja";
Moveit = "Ja";
}
om stopdraw inte bytte, sedan händer ingenting
om (stopDraw == "Nej") {
stopit = "NO";
Moveit = "NO";
}
}
// ================================================
// -------------------------------------------------
// ================================================
// -------------------------------------------------
void keyPressed()
{
röd
om (nyckel == "r" || nyckel == "R") {
rader = color(348,90,90);
}
Orange
om (nyckel == "o ' || nyckel ==" o-) {
rader = color(237,151,12);
}
gul
om (nyckel == "y" || nyckel == "Y") {
rader = color(236,237,12);
}
grön
om (nyckel == "g" || nyckel == "G") {
rader = color(12,237,28);
}
blå
om (nyckel == "b" || nyckel == "B") {
rader = color(12,47,237);
}
}
En kort video av det i handling följer: