Paintbal project

Als U een gezamenlijk project wil starten of aan projecten van anderen mee wilt werken.
Gebruikers-avatar
Berichten: 5
Geregistreerd: 12 Okt 2016, 14:07

Re: Paintbal project

Berichtdoor Bassie » 13 Okt 2016, 18:06

Helaas ben ik de enige in de groep die hiervoor interesse heeft en dus werkt met Arduino.
Hun zijn voorstander voor Siemens TIA S7 omdat het een bekender programma is voor ons en dus meer ervaring ermee hebben.
Ik ben er door andere die Arduino kennen ervan overtuigd dat Arduino veel makkelijker werkt als je het eenmaal begrijpt. Helaas is dat moeilijk wanneer je alleen hieraan werkt.

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Paintbal project

Berichtdoor nicoverduin » 13 Okt 2016, 19:17

Bassie schreef:Ik ben er door andere die Arduino kennen ervan overtuigd dat Arduino veel makkelijker werkt als je het eenmaal begrijpt. Helaas is dat moeilijk wanneer je alleen hieraan werkt.
+1 :mrgreen:
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: Paintbal project

Berichtdoor shooter » 14 Okt 2016, 12:00

een servo aansluiten op een S7 is duur, en zeker niet eenvoudig, de cyclustijden in een S7 zijn zo langzaam dat een nauwkeurige instelling zonder dure hardware niet mogelijk is.

Koop een Nano en zet daar blink without delay op. Of een voorbeeld met een potmeter en een servo, de uitbreiding komt dan vanzelf.
je kunt commandos en posities via de serial monitor op je laptop zien en besturen.
print een cheatsheet en geef die aan de rest van de groep.
Welke opleiding doe je en waar.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 7
Geregistreerd: 02 Sep 2016, 20:17

Re: Paintbal project

Berichtdoor Adam69 » 20 Okt 2016, 00:55

Beste Bas,

Ik heb een begin-sketch voor je gemaakt, dit is natuurlijk nog niet perfect of helemaal klaar, maar wel al een flink stuk op weg.
Omdat ik gestart ben vanuit een standaard Arduino voorbeeld bestand, staan er nog stukjes in het Engels bij, maar ook veel commentaar in het Nederlands.

Wat heb ik er alvast ingestopt:
-Werken met 2 servo's (X-as en de Y-as servo), dus op/neer servo en links/rechts servo
-Opslaan van schiet posities met een maximum van 10 stuks (leek me wel voldoende).
-Starten van "Start programma" met de knop, zodat alle schiet posities, worden doorlopen.

Wat zit er niet in:
-Opslaan van posities in flash geheugen, zodat dit niet vergeten wordt op het moment dat de Arduino wordt uitgezet.
-Geen informatie middels seriële aansluiting, en ook geen display met informatie.

Hoe werkt het?:
Op Pin 2 zit knop "Programmeer", druk deze in en de "Programmeer" Led op Pin 3 gaat aan, ten teken dat het systeem in de programmeer stand staat. In deze stand kan je schiet Posities opslaan, dat doe je door op de start knop te drukken welke op Pin 4 zit. De Arduino slaat de positie op van de 'stand' waarin je nu staat met de servo's, en staat klaar voor de volgende positie. Je kan dus zoals vermeld maximaal 10 posities opslaan, zodra je weer op de Programmeer knop drukt dan gaat de programmeer Led weer uit en verlaat je de programmeer stand.

In de 'rust' stand staan er geen Led's aan en gebeurd er weinig, het systeem wacht op je instructie.

Druk je op de knop "Start" welke op Pin 4 zit, dan gaat de "Start" led aan op Pin 5 en zal het programma worden doorlopen. Dat betekend dat de servo's van positie naar positie gaan, tot alle posities zijn doorlopen, en het systeem weer tot rust komt. Bij elke positie is er een korte rust pauze voor het systeem om tot 'rust' te komen en zal er worden geschoten, dit moet dan worden aangesloten op Pin 7 van de Arduino.

Druk je vanuit de rust stand op beide knoppen tegelijk, dus "Programmeer" en "Start", dan zal de Wis functie gaan activeren. De beide Led's "Programmeer" en "Start" gaan knipperen als teken van deze actie. De posities zijn uit het geheugen, en je kan deze opnieuw gaan invoeren met de "Programmeren" functie.

Aansluitingen:
Ik heb er voor gekozen om alle aansluitingen 'Normal High' te maken. Dus in 'rust' stand staat er 5 volt op de digitale Pin en indien actief, zal deze dan naar 0 volt springen (active low).
Zorg er dus voor dat de Leds aangesloten worden met een weerstand naar de + (5 Volt) van de Arduino. Maar ook hetzelfde met de druk knopjes, deze met een weerstand aansluiten naar de +, en de andere kant van de drukknop op de - (gnd) aansluiten.

De servo's heb ik de Pin's 9 & 10 gegeven, voor de X-as en de Y-as.
En de Potmeters kan je aansluiten op de analoge Pin's A0 en A1.

Overzicht van de Pins:
A0 = Potmeter X-as
A1 = Potmeter Y-as
D2 = Drukknop Programmeer stand
D3 = Led Programmeer stand
D4 = Drukknop Start stand
D5 = Led Start stand
D7 = Relais schieten
D9 = Servo X-as
D10 = Servo Y-as


Dit is een hoop uitleg, maar ik denk dat een voorbeeld (net als een foto) meer uitleg geeft dan elk stukje tekst.
Dus hierbij de Sketch:
cpp code
/* 
Controlling a servo position using a potentiometer (variable resistor)
by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

modified on 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Knob
*/

#include <Servo.h>

Servo myservoX; // create servo object to control a servo
int potpinX= 0; // analog pin used to connect the potentiometer
int valX; // variable to read the value from the analog pin 0
int BeginposX= 10; // Begin positie van de servo X-as

Servo myservoY; // create servo object to control a servo
int potpinY= 1; // analog pin used to connect the potentiometer
int valY; // variable to read the value from the analog pin 1
int BeginposY= 10; // Begin positie van de servo Y-as

// Dit is nodig voor de programmeer knop, led, en stand waarin die staat
const int Progbutton= 2; // the Pin number of the pushbutton
const int Progled= 3; // the Pin number of the Led
int Progenable= false; // Status of wel/niet in programmeer stand

// Dit is nodig voor de start knop, led, en stand waarin die staat
const int Startbutton= 4; // the Pin number of the pushbutton
const int Startled= 5; // the Pin number of the Led
int Startenable= false; // state of Start program

// Dit is voor het opslaan van de posities, max 10 posities
int PositieX [10]= {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int PositieY [10]= {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int PositieAantal= 0;
int Positiesloop= 0;

// Dit is nodig voor het Schiet relais
const int Schieten= 7; // the Pin nummer voor het schieten relais



void setup ()
{
// Besturing voor de X-as en Y-as servo
myservoX.attach (9); // attaches the servo on pin 9 to the servo object
myservoY.attach (10); // attaches the servo on pin 10 to the servo object

// Dit is voor de programmeer knop en led
pinMode (Progbutton, INPUT); // Use digital pin 2 for button as input (normal high)
pinMode (Progled, OUTPUT); // Use digital pin 3 for Led as output (normal high)
digitalWrite (Progled, HIGH); // Programmeer LED begint in uit stand

// Dit is voor de start knop en led
pinMode (Startbutton, INPUT); // Use digital pin 4 for button as input (normal high)
pinMode (Startled, OUTPUT); // Use digital pin 5 for Led as output (normal high)
digitalWrite (Startled, HIGH); // Start LED begint in uit stand

// Dit is voor het Schieten relais
pinMode (Schieten, OUTPUT); // Use digital pin 7 for Schieten as output (normal high)
digitalWrite (Schieten, HIGH); // Schieten in begint stand plaatsen
}



void loop ()
{
// Als je de Programmeer knop tegelijk met de Start knop drukt, wis je alle onthouden posities.
if ( (Progenable== false) && (Startenable== false) && (digitalRead (Startbutton)== LOW) && (digitalRead (Progbutton)== LOW) )
{
// Wis alle posities uit het geheugen
PositieAantal= 0; // Er zijn geen posities meer
delay (500); // Drukknop debounce (niet de beste, maar werkt)

for (int knipper= 0; knipper< 5; knipper++) // Het aantal keer dat de lampjes knipper
{
digitalWrite (Progled, LOW); // Programmeer LED aan zetten
digitalWrite (Startled, LOW); // Start LED aan zetten
delay (200); // Kleine knipper pauze
digitalWrite (Progled, HIGH); // Programmeer LED uit zetten
digitalWrite (Startled, HIGH); // Start LED uit zetten
delay (200); // Kleine knipper pauze
}

delay (1000); // Kleine pauze, voor we weer doorgaan
}


// Controle of de Prgrammeer knop is ingedrukt, zo ja, dan servo's bedienen
if ( (Startenable== false) && (digitalRead (Progbutton)== LOW) )
{
Progenable= !Progenable; // zet de Programmeer stand aan/uit
delay (500); // Drukknop debounce (niet de beste, maar werkt)
}

// Controle of de Start knop is ingedrukt, zo ja, dan Start programma doorlopen
if ( (Progenable== false) && (digitalRead (Startbutton)== LOW) )
{
Startenable= !Startenable; // zet de Start stand aan/uit
delay (500); // Drukknop debounce (niet de beste, maar werkt)
}


if ( (Progenable== true) && (Startenable== false) )
{
// Hier zitten we dus IN de programmeer stand
if (PositieAantal== 10) // Maximaal 10 posities opslaan
{
Progenable= false; // We hebben het maximum posities bereikt, einde Programmeer stand
}
else
{
digitalWrite (Progled, LOW); // Programmeer LED aan zetten

// Tijdens programmeer stand enkel de start knop drukken, voor het opslaan van huidige servo stand
if (digitalRead (Startbutton)== LOW)
{
valX = analogRead (potpinX); // reads the value of the potentiometer (value between 0 and 1023)
valX = map (valX, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180)
PositieX [PositieAantal]= valX; // Opslaan van huidige servo positie X-as

valY = analogRead (potpinY); // reads the value of the potentiometer (value between 0 and 1023)
valY = map (valY, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180)
PositieY [PositieAantal]= valY; // Opslaan van huidige servo positie Y-as

PositieAantal++; // We hebben weer een positie erbij opgeslagen
delay (1000); // Drukknop debounce (niet de beste, maar werkt)
}

// Verplaatsen van de X-as servo
valX = analogRead (potpinX); // reads the value of the potentiometer (value between 0 and 1023)
valX = map (valX, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180)
myservoX.write (valX); // sets the servo position according to the scaled value

// Verplaatsen van de Y-as servo
valY = analogRead (potpinY); // reads the value of the potentiometer (value between 0 and 1023)
valY = map (valY, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180)
myservoY.write (valY); // sets the servo position according to the scaled value

// Algemene vertraging voor servo's om de draai te maken
delay (25); // waits for the servo to get there
}
}


if ( (Progenable== false) && (Startenable== true) )
{
// Hier zijn we in de start stand, alle posities worden 1 voor 1 doorlopen
digitalWrite (Startled, LOW); // Programmeer LED aan zetten

if (Positiesloop< PositieAantal)
{
myservoX.write (PositieX [Positiesloop]); // sets the servo position according to the scaled value
myservoY.write (PositieY [Positiesloop]); // sets the servo position according to the scaled value
delay (1500); // waits for the servo to get there

digitalWrite (Schieten, LOW); // Schieten maar
delay (200); // Wachten tot klaar met Schieten
digitalWrite (Schieten, HIGH); // Klaar met Schieten

Positiesloop++; // Volgende positie
delay (1500); // Korte pauze voor de volgende Positie
}
else
{
Startenable= false; // We zijn klaar met het Start programma
}
}


if ( (Progenable== false) && (Startenable== false) )
{
// Hier zijn we in de rust stand, dus UIT de programmeer en UIT de start stand
digitalWrite (Progled, HIGH); // Programmeer LED uit zetten
digitalWrite (Startled, HIGH); // Start LED uit zetten
Positiesloop= 0; // Zet de positie van Start klaar voor de volgende keer

myservoX.write (BeginposX); // sets the servo to begin position
myservoY.write (BeginposY); // sets the servo to begin position
delay (25); // waits for the servo to get there
}


delay (25); // Korte pauze voor de servo's en het systeem om tot rust te komen
}


Ik dacht dit even binnen een vrij uurtje te maken, maar om eerlijk te zijn ben ik hier dik 2,5 uur mee bezig geweest. Maar het was wel leuk om te doen, en ik bleef een beetje hangen door de schiet fun :D
De sketch is dus niet helemaal klaar en zeker niet perfect, maar je hebt een begin en je kan vanaf hier de sketch gaan aanpassen naar je eigen wens(en) zonder helemaal vanaf niets te moeten beginnen.

Mijn insteek was dus niet om zaken te optimaliseren of alles perfect in functies te plaatsen, maar om zoveel mogelijk commentaar erbij te schrijven waar je wat aan hebt, en hoop dat dat gelukt is. En dat je dus dat je vrijwel direct ziet waar je iets kan aanpassen of waarom het er staat in de code.

Ik ben niet zo vaak op dit forum en zal daarom mogelijk niet snel reageren, maar zal proberen deze week dagelijks te controleren op reacties.

Succes met je project!

Adam

Vorige

Terug naar Gezamenlijke projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten