Pages: [1]   Go Down
Author Topic: lordvon64 youtube demos code  (Read 494 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 2
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

code for youtube demos
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 2
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello,

I usually have my code and stuff on my own website, but its been down so I will just put code here. Because this is my first post here, I am not allowed to post w/ links, but you can see the demos under lordvon64's channel.
Demos:
Arduino Xbee Wireless Full-Range Joystick FPS Servo Turret:
Code:
//CONTROLLER CODE
//Feel free to use this code however you like, but please credit lordvon and this site!
//'ud' and 'lr' are the pot signals for the up/down and left/right pots, respectively.

//(Joysticks and their pot values are not perfect, so some things have to be empirically
//determined. The serial read function is a great tool for collecting the values.)
//range of ud: 29-1014 (middle: around 479-540; avg:~510, center:+/-35)
//range of lr: 0-960 (middle: around 419-471; avg:445, center:+/-30)
//minimum range extreme (from avg) magnitude: 445
//maximum tolerance value: 35

//Print values as 'topic:value', where 'topic' denotes either 'ud' or 'lr',
//and 'value' is the associated pot value.
//Reciever is prompted to record by ':', and ended by ','.

//"" gives characters, '' gives characters in integer form.

//Empirically determined and/or arbitrary constants.
#define ud1 0
#define lr1 1
#define highpulse 2400
#define lowpulse 600
#define lr1avg 445
#define ud1avg 510
#define tolerance1 40
#define range1 445
#define maxadd 35

int ud1val;
int lr1val;
int lr1pulse;
int ud1pulse;
int lr1previous;
int ud1previous;
boolean update;

void setup()
{
  Serial.begin(9600);
  //initialize servo to its center position.
  lr1previous = lr1avg;
  ud1previous = ud1avg;
  Serial.print(':');
  Serial.print((highpulse-lowpulse)/2+lowpulse);
  Serial.print(',');
  Serial.print((highpulse-lowpulse)/2+lowpulse);
}

void loop()
{
  ud1val = analogRead(ud1);
  lr1val = analogRead(lr1);
  update = (abs(lr1avg-lr1val) > tolerance1) || (abs(ud1avg-ud1val) > tolerance1);  
  if (update)
  {
    lr1val = newval(lr1val,(lr1avg-range1),(lr1avg+range1),lr1avg,lr1previous);
    ud1val = newval(ud1val,(ud1avg-range1),(ud1avg+range1),ud1avg,ud1previous);
    lr1previous = lr1val;
    ud1previous = ud1val;
    lr1pulse = map(lr1val,(lr1avg-range1),(lr1avg+range1),lowpulse,highpulse);
    ud1pulse = map(ud1val,(ud1avg-range1),(ud1avg+range1),lowpulse,highpulse);    
    //':' is packet delimiter, ',' is UD/LR delimiter.
    //Each cycle of delimiters denote a packet.
    //Packet: UD value first, then LR value. (:UD,LR:)
    Serial.print(':');
    Serial.print(ud1pulse);
    Serial.print(',');
    Serial.print(lr1pulse);
    delay(25);    
  update = false;
  }
}

int newval(int val, int minval, int maxval, int avgval, int previousval)
{
  int increment;
  increment = val-avgval;
  if (increment > 0)
  {
    increment = increment - tolerance1;
  }
  else if (increment < 0)
  {
    increment = increment + tolerance1;
  }
  increment = map(increment,0,range1-tolerance1,0,maxadd);
  val = increment + previousval;
  if (!(val <= maxval) || !(val >= minval))
  {
    if (val > maxval)
    {
      val = maxval;
    }
    else
    {
      val = minval;
    }
  }
  return val;
}
Code:
//RECIEVER CODE
//Feel free to use this code however you like, but please credit lordvon and this site!
#include <Servo.h>

Servo elevation;
Servo azimuth;

#define highpulse 2400
#define lowpulse 600

char received;
char pulsechar[4];
int counter=0;
int pulse;
boolean delimiter;

void setup()
{
  Serial.begin(9600);
  while (!Serial.available()){}
  received = Serial.read();
  elevation.attach(12);
  azimuth.attach(13);
}

void loop()
{
//  if (Serial.available())
//  {
//    Serial.println(char(Serial.read()));
//  }
  delimiter = (received == ',') || (received == ':');
  if (!delimiter)
  {
    counter = 0;
    while (!delimiter)
    {
      while (!Serial.available()){}
      pulsechar[counter] = received;
      counter += 1;
      received = Serial.read();
      delimiter = (received == ',') || (received == ':');
    }
    pulsechar[counter] = '\0';
    pulse = atoi(pulsechar);
    switch (received)
    {
      case ',':
        azimuth.writeMicroseconds(pulse);
        break;
      case ':':
        elevation.writeMicroseconds(pulse);
        break;
    }
  }
  else
  {
    while (!Serial.available()){}
    received = Serial.read();
  }
}


Wireless PWM with ADC: Xbee with No Microcontroller (Direct I/O)
(just configuration code for the a hyperterminal (i used xctu))
Code:
//pot (potentiometer) reader configuration
//initialization: type "+++", WAIT few seconds for ok,
//then type "AT" and press enter, get ok, then issue commands.
//(numbers are in hexadecimal format)

ATID 4064
ATMY 40
ATDL 64
ATD1 2
ATIR A //(A=10 in hexadecimal format)
ATIT 1
ATWR
Code:
//pwm outputter
//initialization: type "+++", WAIT few seconds for ok,
//then type "AT" and press enter, get ok, then issue commands.
//(numbers are in hexadecimal format)

ATID 4064
ATMY 64
ATDL 40
ATP1 2
ATIU 1
ATIA 40
ATWR


Arduino Servo Turret Controlled by a Nintendo DS Touch Screen
Code:
//Code was adapted from that found on (http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1243499684/0).
#include <Servo.h>

Servo azimuth;
Servo elevation;

// Empirically determined; Voltage between an output high and output low pin.
#define Vref 4.46
#define highpulse 2400
#define lowpulse 600
#define quarter (highpulse-lowpulse)/4
#define s1high lowpulse+quarter/2
#define s2high s1high+quarter
#define s3high s2high+quarter
#define s4high s3high+quarter
#define sdivide .7071
#define maxmag 420

//When looking at DS screen with connector bottom left,
//      the connections are from left to right:
//TOP, X1
//LEFT, Y2
//BOTTOM, X2
//RIGHT, Y1

// Digital pin connections (used to drive power)
#define X1 2 // TOP to Digital output 5
#define Y2 3 // LEFT to digital output 2
#define X2 4 // BOTTOM to digital output 3
#define Y1 5 // RIGHT to digital output 4

// Analog inputs
#define Xin 3 // From X1
#define Yin 4 // From Y1

// set initial touched position
int touchX;
int touchY;
int xpos;
int ypos;
float cosine;
float sine;
float mag;
int apulse;
int epulse;

void setup()
  {
  azimuth.attach(11);
  elevation.attach(12);
  }

void loop()
  {
  if (touched())
    {
    xpos = touchX - 511;
    ypos = touchY - 511;
    if(!(xpos == 0 and ypos == 0))
      {
      mag = sqrt(pow(ypos,2) + pow(xpos,2));
      sine = ypos / mag;
      if(abs(sine)>=sdivide)
        {
        cosine = xpos / mag;
        if(ypos>0)
          {
          apulse = map(cosine*10000,-7071,7071,s2high,s3high);
          }
        else
          {
          if(xpos >= 0)
            {
            apulse = map(cosine*10000,7071,0,s4high,highpulse);
            }
          else
            {
            apulse = map(cosine*10000,0,-7071,lowpulse,s1high);
            }
          }
        }
      else
        {
        if(xpos>0)
          {
          apulse = map(sine*10000,7071,-7071,s3high,s4high);
          }
        else
          {
          apulse = map(sine*10000,-7071,7071,s1high,s2high);
          }
        }
      }
    azimuth.writeMicroseconds(apulse);
    if(mag>maxmag or mag<0)
      {
      mag=maxmag/2;
      }
    epulse = map(mag,0,maxmag,highpulse,lowpulse);
    elevation.writeMicroseconds(epulse);
    }
  }

boolean touched()
  {
  boolean touch = false;
  // Horizontal routine Y1:Y2::Vcc:Gnd
  pinMode(Y2, OUTPUT);
  digitalWrite(Y2, LOW);
  pinMode(Y1, OUTPUT);
  digitalWrite(Y1, HIGH);
  // X1,X2 high impedance (input mode)
  pinMode(X1, INPUT);
  pinMode(X2, INPUT);
  // wait a bit, then read from X1
  delay(10);
  touchX = analogRead(Xin);
  // Vertical routine X1:X2::Vcc:Gnd
  pinMode(X2, OUTPUT);
  digitalWrite(X2, LOW);
  pinMode(X1, OUTPUT);
  digitalWrite(X1, HIGH);
  // Y1,Y2 high impedance (input mode)
  pinMode(Y1, INPUT);
  pinMode(Y2, INPUT);
  // wait a bit, then read from Y1
  delay(10);
  touchY = analogRead(Yin);

  // Only read touch if coords are below 1000 and above 0
  //      (stops errors with certain screens)
  if(touchX < 1023 and touchX > 0 and touchY < 1023 and touchY > 0)
    {
    touch = true;
    }

  return touch;
  }
Logged

Pages: [1]   Go Up
Jump to: