Search Code

Les 88: Een servomotor besturen met behulp van twee drukknopschakelaars

Les 88: Een servomotor besturen met behulp van twee drukknopschakelaars

Dit project demonstreert hoe je een servomotor kunt aansturen met behulp van twee drukknoppen met een Arduino. In plaats van te vertrouwen op een potentiometer of een seriële opdracht, kun je eenvoudige tactiele schakelaars gebruiken om een servo handmatig naar links of rechts te bewegen. Dit is ongelooflijk nuttig voor toepassingen waarbij je directe, fysieke controle over een mechanisme nodig hebt, zoals het bouwen van een robotarm, het aanpassen van een cameragimbal, of het creëren van een op afstand bestuurd pan-tilt-systeem. Met de knoppen kun je de hoek van de servo stapsgewijs aanpassen, met de mogelijkheid om de knop ingedrukt te houden om de servo over het volledige bewegingsbereik te laten vegen.

Hier zijn een paar praktische projecten die je met deze opstelling kunt bouwen:

  • Het bouwen van een handmatig bedieningspaneel voor een robotarm of grijper.
  • Het creëren van een op afstand bestuurbare cameraschuif of pan-tilt-kop.
  • Het ontwikkelen van een fysieke bedieningsinterface voor een modelvliegtuig of bootroer.
  • Het maken van een eenvoudige "teach pendant" om posities op te nemen voor een CNC-machine of 3D-printer.

Hardware en componenten

Dit project vereist slechts een paar basiscomponenten, waardoor het een uitstekend startpunt is om te leren over zowel invoer- als uitvoerapparaten met de Arduino.

  • Arduino-board (Uno, Nano, Mega, enz.)
  • Servomotor (bijv. SG90 of MG995)
  • Twee drukknoppen (momentaan)
  • Jumperdraden
  • Breadboard (optioneel maar aanbevolen)

Bekabelingsgids

In de video is de bedrading eenvoudig. De signaalpin van de servomotor is verbonden met een PWM-capabele pin op de Arduino, in dit voorbeeld pin 9. De voeding en aarde voor de servo zijn verbonden met de 5V- en GND-pinnen van de Arduino. De twee drukknoppen zijn op vergelijkbare wijze bedraad. Eén poot van elke knop is verbonden met de aarde, en de andere poot is verbonden met een digitale ingangspin op de Arduino (pin 2 voor de "links"-knop en pin 3 voor de "rechts"-knop). De code gebruikt de interne pull-up-weerstanden, dus er zijn geen externe weerstanden nodig voor de knoppen. (in video op 00:57)

Arduino wriing for Sevo motor with 2 push buttons
Arduino wriing for Sevo motor with 2 push buttons

Uitleg van de code

De code is ontworpen om eenvoudig configureerbaar te zijn. De belangrijkste door de gebruiker instelbare delen staan bovenaan de sketch. Hier is een uitsplitsing van de belangrijke variabelen en definities die je mogelijk wilt aanpassen voor je eigen project.

#include <Servo.h>

Servo myservo;  // maak servo-object om een servo aan te sturen
int servoPin = 9;// deze pin moet een PWM-pin zijn ~
int angle =90;    // beginhoek voor servo
int angleStep =5;

#define LEFT 2   // pin 2 is verbonden met de links-knop
#define RIGHT  3  // pin 3 is verbonden met de rechts-knop
  • servoPin: Deze variabele definieert de Arduino-pin waarmee de signaaldraad van de servo is verbonden. Het is cruciaal om een pin te gebruiken die Pulse Width Modulation (PWM) ondersteunt, meestal aangegeven met een ~-symbool op het board.
  • angle: Dit stelt de beginhoek van de servo in wanneer de Arduino start. De standaardwaarde is 90 graden, wat de servo doorgaans centreert.
  • angleStep: Dit is de stap waarmee de servohoek elke keer dat een knop wordt ingedrukt verandert. Een waarde van 5 betekent dat elke druk de servo 5 graden beweegt. Je kunt dit verhogen voor snellere beweging of verlagen voor fijnere controle.
  • LEFT en RIGHT: Deze #define-richtlijnen wijzen de digitale pinnen toe waarmee de drukknoppen zijn verbonden. Als je de knoppen op andere pinnen aansluit, moet je deze waarden wijzigen zodat ze overeenkomen met je opstelling.

De kernlogica in de loop()-functie controleert of een knop is ingedrukt (door een LAAG signaal te lezen vanwege de pull-up-configuratie). Als de "rechts"-knop wordt ingedrukt, verlaagt het de angle-variabele met angleStep. Als de "links"-knop wordt ingedrukt, verhoogt het de angle. De code bevat grenswaardecontroles om ervoor te zorgen dat de hoek binnen het bereik van 0 tot 180 graden blijft. De functie myservo.write(angle) wordt vervolgens gebruikt om de servo opdracht te geven naar de nieuwe positie te bewegen.

Live projectdemonstratie

In de videodemonstratie wordt de functionaliteit duidelijk getoond. Het indrukken en vasthouden van de "links"-knop zorgt ervoor dat de servo soepel naar links beweegt, waarbij de hoek telkens met 5 graden toeneemt, totdat deze 180 graden bereikt en stopt. Op dezelfde manier zorgt het indrukken en vasthouden van de "rechts"-knop ervoor dat de servo terug naar rechts beweegt, waarbij de hoek afneemt totdat deze 0 graden bereikt. De huidige hoek wordt naar de Seriële Monitor gestuurd, zodat je de exacte positie van de servo in realtime kunt zien. (in video op 05:20)

Video-hoofdstukken

  • [00:00] Inleiding tot het aansturen van een servo met knoppen
  • [00:57] Bekabelingsgids voor de servo en drukknoppen
  • [02:12] Uitleg van de code, deel 1: Setup en configuratie
  • [03:25] Uitleg van de code, deel 2: De hoofdlooplogica
  • [05:20] Live demonstratie van het project
  • [06:23] Conclusie en mogelijke toepassingen

Afbeeldingen

2 pin tactile push button switch
2 pin tactile push button switch
SG90 Mini Servo Motor
SG90 Mini Servo Motor
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
Arduino wriing for Sevo motor with 2 push buttons
Arduino wriing for Sevo motor with 2 push buttons
891-Lesson 88: Servo control with 2 push buttons
Taal: C++
/*
 * S05-05 Servo control with 2 push buttons
 * Download and resource page https://robojax.com/RJT764
 Watch video on YouTube https://www.youtube.com/watch?v=J_kbyAY1rLM
 * 
 * Written by Ahmad Shamshiri for Robojax.com 
 * on Jan 15, 2019 at 19:15 in Ajax, Ontario, Canada

  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
/*
 Controlling a servo with two Push buttons with Arduino
 when Left  push button is pressed, the servo start moving to the left until it reaches 180( or zero) degrees
 when Right  push button is pressed, the servo start moving to the right until it reaches 180( or zero) degrees
At any instance if the button is released, servo stops

*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
int servoPin = 9;// this pin must be of those with PWM ~
int angle =90;    // initial angle  for servo
int angleStep =5;

#define LEFT 2   // pin 2 is connected to left button
#define RIGHT  3  // pin 3 is connected to right button

void setup() {
  // Servo button demo by Robojax.com
  Serial.begin(9600);          //  setup serial
  myservo.attach(servoPin);  // attaches the servo on pin 9 to the servo object
  pinMode(LEFT,INPUT_PULLUP); // assign pin 12 ass input for Left button
  pinMode(RIGHT,INPUT_PULLUP);// assing pin 2 as input for right button
  myservo.write(angle);// send servo to the middle at 90 degrees
 Serial.println("Robojax Servo 2 Buttons ");
}

void loop() {
  // Servo button demo by Robojax.com
  while(digitalRead(RIGHT) == LOW){

    if (angle > 0 && angle <= 180) {
      angle = angle - angleStep;
       if(angle < 0){
        angle = 0;
       }else{
      myservo.write(angle); // move the servo to desired angle
      Serial.print("Moved to: ");
      Serial.print(angle);   // print the angle
      Serial.println(" degree");
       }
    }
    
  delay(100); // waits for the servo to get there
  }// while
 // Servo button demo by Robojax.com

  while(digitalRead(LEFT) == LOW){

    // Servo button demo by Robojax.com
    if (angle >= 0 && angle <= 180) {
      angle = angle + angleStep;
      if(angle >180){
        angle =180;
       }else{
      myservo.write(angle); // move the servo to desired angle
      Serial.print("Moved to: ");
      Serial.print(angle);   // print the angle
      Serial.println(" degree");
       }
    }
    
  delay(100); // waits for the servo to get there
  }// 

  
}

Bestanden📁

Andere bestanden