Treadmill met Arduino

Als U een gezamenlijk project wil starten of aan projecten van anderen mee wilt werken.
Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Treadmill met Arduino

Berichtdoor shooter » 17 Mrt 2015, 22:42

volgens mij wil paul mee op de slee
paul deelen
shooter@home.nl

Advertisement

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Treadmill met Arduino

Berichtdoor pjh » 20 Mrt 2015, 12:08

haha.
Jahhhhhhhh.--jihiiiii- :D :D :D

Dit heb ik al: https://youtu.be/f31K_ZtNer8
Arduino:
Code: Alles selecteren
volatile unsigned long eerdere_tijd;
volatile unsigned long aantal_rondjes;
volatile unsigned long starttijd;
volatile unsigned long snelheid;
int lengte_loopband_in_mm = 5000;

volatile unsigned long eerdere_tijd2;
volatile unsigned long aantal_rondjes2;
volatile unsigned long starttijd2;
volatile unsigned long snelheid2;
int lengte_loopband_in_mm_2 = 5000;
volatile int d=0;
volatile int d2=0;

void setup(){
  Serial.begin(9600);
  attachInterrupt(0, teller, FALLING);
  attachInterrupt(1, teller2, FALLING);
  starttijd = millis();
};

void loop(){
/*  snelheid = 1000*(aantal_rondjes * lengte_loopband_in_mm )/eerdere_tijd-starttijd;
  snelheid2 = 1000*(aantal_rondjes2 * lengte_loopband_in_mm_2 )/eerdere_tijd2-starttijd2;

  Serial.print(snelheid);
  Serial.print(",");
  Serial.println(snelheid);
  mySerial.print(snelheid);
  mySerial.print(",");
  mySerial.println(snelheid2);
  */
  if(d){
    Serial.print(1);
    Serial.print(",");
    Serial.println(d);
    d=0;
  }
  if(d2){
    Serial.print(2);
    Serial.print(",");
    Serial.println(d2);
    d2=0;
  }
}

void teller(){
  if (millis() - eerdere_tijd > 80){
    aantal_rondjes++;
    d=millis() - eerdere_tijd;
    eerdere_tijd = millis();
  };
}

void teller2(){
  if (millis() - eerdere_tijd2 > 80){
    aantal_rondjes2++;
    d2=millis() - eerdere_tijd2;
    eerdere_tijd2 = millis();
  };
}


Processing:
Code: Alles selecteren
import processing.serial.*;

Serial myPort;       
int linefeed = 10;   // Linefeed in ASCII
int numSensors = 1;  // we will be expecting for reading data from 1 sensors
int sensors[];       // array to read the 4 values
int pSensors[];      // array to store the previuos reading, usefur for comparing

int buffer = 1000;
int[] data1 = new int[1000];
int[] data2 = new int[1000];

int teller1=0;
int teller2=0;

int een_rondje_van_het_wiel = 828; // in mm want ook in ms
float actuele_snelheid[] = {
  0, 0
};


void setup() {
  size(800, 600); 
  println(Serial.list());

  myPort = new Serial(this, Serial.list()[2], 9600);
  myPort.bufferUntil(linefeed);
}

void draw() {
    for (int xx = 0 ; xx <640; xx++){
   stroke(0);
   line(xx,0,xx,height);
   stroke(255);
   line(xx,height/2,xx,height/2+data1[xx]);
   line(xx,height/2,xx,height/2-data2[xx]);
   }
}

void serialEvent(Serial myPort) {

  String myString = myPort.readStringUntil(linefeed);

  if (myString != null) {
    myString = trim(myString);
    pSensors = sensors;
    sensors = int(split(myString, ','));
    int y = sensors[0];
    int z = sensors[1];
   
    if (y == 1) {
      print( "mill links:  " + "\t");
      print( sensors[1] + "\t");
      data1[teller1] = z;
      saveStrings("mill_1.exc", str(data1));
      teller1++;
      if (teller1>width) teller1=0;
    }
    else if (y==2) {
      print( "mill rechts: " + "\t");
      print( sensors[1] + "\t");
      data2[teller2] = z;
     saveStrings("mill_2.exc", str(data2));
     teller2++;
      if (teller2>width) teller2=0;
    }
    println();
  }
}

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Treadmill met Arduino

Berichtdoor pjh » 20 Mrt 2015, 22:08

Update ▬ berekening tijden (non-codisch)

wiel heeft diameter van 200 mm
wiel heeft omtrak van pi * 200 = 628 mm

1 km/uur ==> 0,27777777 mm/ms (1 : 3,6)
628 mm => 628 / 3,6 = 2260,8 ms = 2,2608 seconden.

DUS: bij 1 km/uur duurt het een dikke twee seconden voor de "rotatie sensor" weer afgaat.

Je gestelde maximale snelheid van de Husky is 43 km/uur
43 km/uur = 2260,8 ms / 43 = 52,57 ms

De door mij gebruikte debounce-tijd van 80 ms (zie sketch hierboven) zal naar 50 ms worden verlaagd om de beestjes recht te doen.
Om van de sensor naar km/uur te komen hoeven we dus alleen 2260 te delen door het aantal milliseconden tussen de pulsen.

Code: Alles selecteren
 int snelheid = 2260/d;

wvv

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Treadmill met Arduino

Berichtdoor pjh » 21 Mrt 2015, 10:19

typfoutje
628 mm => 628 × 3,6 = 2260,8 mm

Berichten: 6
Geregistreerd: 13 Mrt 2015, 21:17

Re: Treadmill met Arduino

Berichtdoor Nuyvilaq » 21 Mrt 2015, 23:07

De eerste test is goed bevallen ik kreeg goed signaal via de reedcontacten.
Ik heb twee fietscomputers gekocht bij de Blokker voor 9 euro en daar het contact en de bedrading van gebruikt.

https://www.youtube.com/watch?v=_MEeAL4Upzg

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Treadmill met Arduino

Berichtdoor pjh » 22 Mrt 2015, 09:00

Howel de honden lopen, maar jij snel veel meters in Arduinoland!
top

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Treadmill met Arduino

Berichtdoor pjh » 23 Mrt 2015, 21:56

Afbeelding
Ter leering ende vermaeck heb ik mijn eigen programmeer geklungel met CamStudio opgenomen.
Het laat mogelijk vooral zien hoe je op een volstrekt foute wijze toch je doel kunt bereiken.
Misschien dat iemand zich beter voelt en-of meer durft als ik mijn meuk hier plemp:

= korte toelichting: Een arduino pompt via een Serial.println(""); steeds het getal 1 of 2 uit, gevolgd door het aantal milliseconden t.o.v. vorige 'run'.
Deze tijden worden door een http://www.processing.org programma vertaald naar het beeldscherm. Bedoeling is iemand snel wegwijs te maken.

7:47 https://youtu.be/Q4CyTPILU_w
9:46 https://youtu.be/2M5EQgAXC5o
4:01 http://youtu.be/AhvrOogL8GE
9:20 http://youtu.be/Yi3pCN51XqA

Hier code zoals bij einde filmpjes.
Code: Alles selecteren
    import processing.serial.*;


    Serial myPort;       
    int linefeed = 10;   // Linefeed in ASCII
    int sensors[];       // array to read the 4 values
    int pSensors[];      // array to store the previuos reading, usefur for comparing

    int buffer = 10000;
    int[] data1 = new int[buffer];
    int[] data2 = new int[buffer];

    int teller1=1;
    int teller2=1;
   
    boolean flag1 = false;
    boolean flag2 = false;
   
    long tot1;
    long tot2;
   
    float gem1;
    float gem2;
   
   
  PFont f;

    void setup() {
      size(800, 600);
      // List all the available serial ports in the output pane.
      // You will need to choose the port that the Wiring board is
      // connected to from this list. The first port in the list is
      // port #0 and the third port in the list is port #2.
      println(Serial.list());

      myPort = new Serial(this, Serial.list()[2], 115200);
      // read bytes into a buffer until you get a linefeed (ASCII 10):
      myPort.bufferUntil(linefeed);
     
      f = createFont("Monospaced.bold-72", 36);
      textFont(f);
    }

    void draw() {
      if (flag1){
        fill(0);
        rect(2,2,width/2-4,height-4);
        fill(255);
        text("Snelheid :", 10,100);
        text(2260.0/data1[teller1-1], 190 + 10,100);
        flag1=false;
        text("Gemid:", 10,150);
       
        tot1=0;
        for(int i=1;i<teller1-1;i++){
          tot1 = tot1 + data1[i];
        }
        gem1 = 2260.0/(tot1/(teller1-1));
        text(gem1, 190 + 10,150);
      }
     
      if (flag2){
        fill(0);
        rect(width/2+1,2,width/2-4,height-4);
        fill(255);
        text("Snelheid:", width/2+10,100);
        text(2260.0/data2[teller2-1], 190+width/2+10,100);
        flag2=false;
        text("Gemid:", width/2+10,150);
       
        tot2=0;
        for(int i=1;i<teller2-1;i++){
          tot2 = tot2 + data2[i];
        }
        gem2 = 2260.0/(tot2/(teller2-1));
        text(gem2, 190+width/2+10,150);
      }
     
       /* for (int xx = 0 ; xx <800; xx++){
       stroke(0);
       line(xx,0,xx,height);
       stroke(255);
       line(xx,height/2,xx,height/2+data1[xx]);
       line(xx,height/2,xx,height/2-data2[xx]);
       }
       */
    }

    void serialEvent(Serial myPort) {

      // read the serial buffer:
      String myString = myPort.readStringUntil(linefeed);

      // if you got any bytes other than the linefeed:
      if (myString != null) {
        // schrijf data weg naar schijf voordat het wordt veranderd.
           
        myString = trim(myString);

        // split the string at the commas
        // and convert the sections into integers:

        pSensors = sensors;
        sensors = int(split(myString, ','));

        // print out the values you got:
        int y = sensors[0];
        int z = sensors[1];
       
        if (y == 1) {
          print( "mill links:  " + "\t");
          print( sensors[1] + "\t");
          data1[teller1] = z;
          saveStrings("mill_1.exc", str(data1));
          teller1++;
          if (teller1>width) teller1=0;
          flag1=true;
        }
       
        else if (y==2) {
          print( "mill rechts: " + "\t");
          print( sensors[1] + "\t");
          data2[teller2] = z;
         saveStrings("mill_2.exc", str(data2));
         teller2++;
          if (teller2>width) teller2=0;
          flag2=true;
        }

        // add a linefeed after all the sensor values are printed:
        println();
      }
    }

Laatst gewijzigd door pjh op 23 Mrt 2015, 22:52, in totaal 2 keer gewijzigd.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Treadmill met Arduino

Berichtdoor shooter » 23 Mrt 2015, 22:02

paul maak je ook een filmpje als je in de slee zit?
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Treadmill met Arduino

Berichtdoor pjh » 23 Mrt 2015, 22:11

Dat gaat een eerste klas filmpie worden denk ik.
Ben ik zo doorzichting Paul? ;)

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Treadmill met Arduino

Berichtdoor pjh » 23 Mrt 2015, 23:19

Afbeelding
respectievelijk: km/uur, km/uur, seconden vanaf 2 minuten, meters.
Links mill 1, rechts mill2.
Iedere Mill start bij eerste signaal

Code: Alles selecteren
import processing.serial.*;


Serial myPort;       
int linefeed = 10;   // Linefeed in ASCII
int sensors[];       // array to read the values
int pSensors[];      // array to store the previuos reading, usefur for comparing

int buffer = 1000;
int[] data1 = new int[buffer];
int[] data2 = new int[buffer];

int teller1=1;
int teller2=1;

boolean flag1 = false;
boolean flag2 = false;

long tot1;
long tot2;

float gem1;
float gem2;

long starttijd1;   
long starttijd2;

PFont f;

void setup() {
  size(800, 600);
  frameRate(120);
  // List all the available serial ports in the output pane.
  // You will need to choose the port that the Wiring board is
  // connected to from this list. The first port in the list is
  // port #0 and the third port in the list is port #2.
  println(Serial.list());

  myPort = new Serial(this, Serial.list()[2], 115200);
  // read bytes into a buffer until you get a linefeed (ASCII 10):
  myPort.bufferUntil(linefeed);

  f = createFont("Monospaced.bold-72", 36);
  textFont(f);
}

void draw() {
  if (teller1==1) {
    starttijd1 = millis();
  }
  if (teller2==1) {
    starttijd2 = millis();
  }

  if (flag1) {
    fill(0);
    rect(2, 2, width/2-4, height-4);
    fill(255);
    text("Snelheid :", 10, 100);
    text(2260.0/data1[teller1-1], 190 + 10, 100);
    flag1=false;
    text("Gemid:", 10, 150);

    tot1=0;
    for (int i=1; i<teller1-1; i++) {
      tot1 = tot1 + data1[i];
    }
    gem1 = 2260.0/(tot1/(teller1-1));
    text(gem1, 190 + 10, 150);

    text("Counter:", 10, 200);
    text(120-(millis()-starttijd1)/1000.0, 190 + 10, 200);

    text("Afstand:", 10, 250);
    text(teller1*628/1000.0, 190 + 10, 250);
  }

  if (flag2) {
    fill(0);
    rect(width/2+1, 2, width/2-4, height-4);
    fill(255);
    text("Snelheid:", width/2+10, 100);
    text(2260.0/data2[teller2-1], 190+width/2+10, 100);
    flag2=false;
    text("Gemid:", width/2+10, 150);

    tot2=0;
    for (int i=1; i<teller2-1; i++) {
      tot2 = tot2 + data2[i];
    }
    gem2 = 2260.0/(tot2/(teller2-1));
    text(gem2, 190+width/2+10, 150);

    text("Counter:", width/2+10, 200);
    text(120-(millis()-starttijd2)/1000.0, 190+width/2+10, 200);

    text("Afstand:", width/2+10, 250);
    text(teller2*628/1000.0, 190+width/2+10, 250);
  }

  /* for (int xx = 0 ; xx <800; xx++){
   stroke(0);
   line(xx,0,xx,height);
   stroke(255);
   line(xx,height/2,xx,height/2+data1[xx]);
   line(xx,height/2,xx,height/2-data2[xx]);
   }
   */
}

void serialEvent(Serial myPort) {

  // read the serial buffer:
  String myString = myPort.readStringUntil(linefeed);

  // if you got any bytes other than the linefeed:
  if (myString != null) {
    // schrijf data weg naar schijf voordat het wordt veranderd.

    myString = trim(myString);

    // split the string at the commas
    // and convert the sections into integers:

    pSensors = sensors;
    sensors = int(split(myString, ','));

    // print out the values you got:
    int y = sensors[0];
    int z = sensors[1];

    if (y == 1) {
      print( "mill links:  " + "\t");
      print( sensors[1] + "\t");
      data1[teller1] = z;
      saveStrings("mill_1.exc", str(data1));
      teller1++;
      if (teller1>width) teller1=0;
      flag1=true;
    } else if (y==2) {
      print( "mill rechts: " + "\t");
      print( sensors[1] + "\t");
      data2[teller2] = z;
      saveStrings("mill_2.exc", str(data2));
      teller2++;
      if (teller2>width) teller2=0;
      flag2=true;
    }

    // add a linefeed after all the sensor values are printed:
    println();
  }
}

VorigeVolgende

Terug naar Gezamenlijke projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 5 gasten