Cashar 97-3: Xakamaynta Mootada Servo iyadoo la isticmaalayo Encoder Wareega ah oo Xagasha lagu Muujiyo LCD-ka
Mashruucani wuxuu muujinayaa sida loo dhiso kontoroolka mawqifka matoorada servo ee saxda ah iyadoo la adeegsanayo rotary encoder, iyadoo jawaab celinta xagasha waqtiga dhabta ah lagu muujinayo I2C LCD. Halkii laga isticmaali lahaa gacan-wareega potentiometer, kaas oo leh xaddidyo jireed oo uu waqti ka dib xidhi karo, naqshaddani waxay isticmaashaa rotary encoder farsamo oo si joogto ah u wareega, taasoo bixisa adkeysi dheeri ah iyo kontorool dabacsan. Mashruucani wuxuu ku habboon yahay qof kasta oo u baahan mawqif sax ah oo lagu celin karo mashruucyadiisa Arduino.
Qaabkani wuxuu ku habboon yahay codsiyo badan oo wax ku ool ah:
- Dhisidda mount kamarad fog-contorool ah oo wareega iyo leexasho leh halkaas oo aad u baahan tahay kontorool xagal sax ah.
- Abuurista kala-goyska gacanta robotic-ka oo leh gacan-wareeg gacmeed oo lagu hagaajinayo mawqifka.
- Horumarinta tijaabiyaha dusha kontoroolka ee doon shiraac ah ama diyaarad.
- Dhisidda raad-raaca saqafka cadceedda ee la hagaajin karo kaas oo gacanta lagu mawqifin karo.
- Samaynta qalab gaar ah ama qalab gelin ah oo loogu talagalay 3D printer ama mashiinka CNC si loo hagaajiyo goobaha.
Qalabka Loo Baahan Yahay
- Arduino Uno (ama board la mid ah)
- Rotary encoder module (nooca PCB ama encoder qaawan oo leh resistors)
- Matoor servo (nooc kasta oo caadi ah, tusaale ahaan, birta gear-ka ama plastic-ka yar ee gear-ka)
- I2C LCD (16x2 xarfood)
- Fiilooyinka jumper
- Breadboard (ikhtiyaar, haddii aadan isticmaalin encoder PCB)
- Saddex resistors oo 1kΩ ilaa 100kΩ ah (haddii aad isticmaalayso rotary encoder qaawan)
Hagaha Fiilooyinka
Mashruucani wuxuu leeyahay saddex qaybood oo waaweyn oo la xiriirinayo: rotary encoder-ka, matoorada servo, iyo I2C LCD. Jaantuska fiilooyinka ee hoose wuxuu muujinayaa dhammaan xiriirrada lagama maarmaanka ah. (fiidiyowga 05:35)
Rotary encoder module-ku waa gelinta koowaad. Pin-yada CLK iyo DT waxay ku xiran yihiin pin-yada dijitaalka ah ee Arduino 2 iyo 3. Pin-ka "+" wuxuu ku xiran yahay 3.3V, pin-ka "GND" wuxuuna ku xiran yahay dhulka. Haddii aad isticmaalayso encoder qaawan, waa inaad ku darsataa saddex resistor kor-u-jiidaya (oo u dhexeeya 1kΩ iyo 100kΩ) oo ka yimaada labada pin ee xogta ee encoder-ka iyo pin-ka switch-kiisa ilaa 3.3V, sida jaantuska ku muujisan. (fiidiyowga 07:03)
Matoorada servo wuxuu leeyahay saddex fiilo. Fiilada signal-ka (caadi ahaan huruud ama orange) waxay ku xiran tahay pin PWM awood u leh, kaas oo ah pin 9 tusaalahan. Fiilada korontada (caadi ahaan casaan) waxay ku xiran tahay 5V, fiilada dhulka (caadi ahaan bunni ama madow) waxayna ku xiran tahay dhulka. Matoorada servo-ga xoogga sare leh, waxaa lagu talinayaa in la isticmaalo koronto 5V oo dibadda ah si looga fogaado culeyska xakameeyaha danabka ee Arduino. (fiidiyowga 06:03)
I2C LCD wuxuu u baahan yahay afar xiriir. Pin-ka VCC wuxuu ku xiran yahay 5V, GND dhulka, SDA pin-ka A4 ee Arduino, iyo SCL pin-ka A5. Haddii kale, waxaad ku shidi kartaa LCD-ga pin-ka 5V ee madaxa ICSP. (fiidiyowga 06:31)
Ku Rakibidda Maktabadaha Loo Baahan Yahay
Ka hor intaadan soo gelin koodhka, waxaad u baahan tahay inaad ku rakibto laba maktabad. Midda koowaad waa maktabadda LiquidCrystal_I2C, kaas oo aad ku dari karto adoo soo dejinaya faylka ZIP ee la bixiyay oo adigoo isticmaalaya menu-ga Sketch → Include Library → Add .ZIP Library. (fiidiyowga 13:28)
Midda labaad waa maktabadda Encoder ee Paul Stoffregen. Tan waxaa si toos ah loogu rakibi karaa Maareeyaha Maktabadda adoo u gudbaya Sketch → Include Library → Manage Libraries, raadinta "encoder", iyo gujinta rakib. (fiidiyowga 13:59)
Sharaxaadda Koodhka
Koodhku wuxuu u qorsheysan yahay inuu aad u habboonaado. Halbeegyada muhiimka ah dhammaantood waxay ku qeexan yihiin dusha sare ee sketch-ka, taasoo kuu ogolaanaysa inaad si fudud u habeeyso dhaqanka iyada oo aanad u baahnayn inaad qoto dheer u gasho macquulka. (fiidiyowga 17:52)
const int SW_PIN = 4;//define a pin for rotary encode switch
const int PIN_A =2;
const int PIN_B =3;
const int homePosition = 90; //initial position
const int stepValue = 3;//how fast the servo should rotate when turning the knob
const int servoPin = 9;//~must be a pin that is labeled with ~
SW_PIN,PIN_A, iyoPIN_B: Halbeegyadani waxay qeexayaan pin-yada Arduino ee ku xiran switch-ka encoder-ka, CLK, iyo DT siday u kala horreeyaan. Haddii aad isticmaasho pin-yo kale, beddel qiimahaan.homePosition: Kani waa xagasha (darajo ahaan) uu matoorada servo u dhaqaaqi doono marka la riixo badhanka push-button ee encoder-ka. Waxaad u beddeli kartaa qiime kasta oo u dhexeeya 0 iyo 180.stepValue: Kani wuxuu xakameeyaa xasaasiyadda kontoroolka. Wuxuu go'aamiyaa inta darajo ee xagasha matoorada servo uu isku beddelo detent kasta (gujis) ee encoder-ka. Qiime sare wuxuu ka dhigayaa matoorada inuu si dhakhso leh u dhaqaaqo, halka qiime hoose uu u oggolaanayo kontorool fiicnaan leh.servoPin: Kani waa pin-ka PWM ee fiilada signal-ka ee matoorada servo ku xiran tahay. Hubi in pin-kani uu leeyahay calaamadda "~" oo ku xigta board-kaaga Arduino, sababtoo ah kaliya pin-yadani waxay dhali karaan signal PWM-ga lagama maarmaanka ah.
Koodku waxaa sidoo kale ku jira shaqo gaar ah, lcdAngel(int angel). Shaqadani waxay mas'uul ka tahay cusboonaysiinta qiimaha xagasha ee LCD-ga. Waxay marka hore nadiifisaa lambarkii hore ee shaashadda, ka dibna daabacdaa xagasha cusub oo ay ku xigto calaamadda darajo (°). Shaqadan waxaa si otomaatig ah loogu wacaa mar kasta oo xagasha servo-ga isbeddesho, marka uma baahnid inaad si toos ah ula macaamisho. (fiidiyowga 27:56)
Wadista servo-ga ee encoder-ka waxaa lagu sharaxay Casharka 97-2: Xakamaynta Servo Motor iyadoo la isticmaalayo Rotary Encoder.
Muuujinta Mashruuca Tooska ah
Marka koodka la soo geliyo, LCD-ga wuxuu marka hore soo bandhigi doonaa "Robojax Encoder" iyo "Servo Test" shaashad bilow ah laba ilbiriqsi ka hor inta aan la nadiifin oo aan la muujin xagasha hadda jirta. (fiidiyowga 24:10)
Markaad wareejiso encoder-ka, servo-ga wuxuu si habsami leh ugu dhaqaaqi doonaa meeshiisa cusub, xagashuna waxay ku cusboonaysiin doontaa LCD-ga. Jihada wareeggu waxay go'aamisaa in xagashu kordho ama yaraato. Haddii jihadu u ekaato mid rogan, waxaad si fudud u beddeli kartaa isku xirka PIN_A iyo PIN_B ama qeexitaankooda koodka. (fiidiyowga 17:32)
Dhaqaaqa servo-ga wuxuu ku xaddidan yahay inta u dhaxaysa 0 iyo 180 darajo. Haddii aad sii wado wareejinta encoder-ka marka aad dhaafto xadkan, servo-gu wuxuu istaagi doonaa xadka, isagoo ka hortagaya waxyeelo farsamo. (fiidiyowga 25:54)
Riixida badhanka isku-dhisan ee encoder-ka ayaa si degdeg ah ugu soo celin doonta servo-ga homePosition aad qeexday. Tani waxay faa'iido u leedahay dejinta meel tixraac ah oo la yaqaan ama meel "guri". (fiidiyowga 27:13)
Mashruucyada la xiriira fiidiyowgan
- Casharka 97-1: Ogaanshaha Wareejinta Rotary Encoder iyo Riixista Badhanka
- Casharka 97-2: Xakamaynta Servo Motor iyadoo la isticmaalayo Rotary Encoder
Cutubyada
- [00:01] Hordhaca Xakamaynta Servo-ga iyadoo la isticmaalayo Rotary Encoder
- [01:46] Sababta loo isticmaalo Rotary Encoder halkii Potentiometer
- [05:35] Ku xirista Nooca PCB ee Rotary Encoder-ka
- [07:03] Ku xirista Rotary Encoder-ka Qaawan ee leh Resistors
- [12:05] Ku xirista Shaashadda I2C LCD
- [13:28] Rakibaadda Maktabadaha Loo Baahan Yahay
- [14:54] Fahamka Koodka Tusaalaha Aasaasiga ah ee Encoder-ka
- [17:52] Beddelka Koodka ee Servo-ga iyo Badhanka
- [20:20] Sharaxaad Buuxda oo Koodka ah ee Xakamaynta Servo-ga iyo LCD-ga
- [30:01] Muujin Toos ah oo Mashruuca ah
/*
* Lesson 97-3: Controlling Servo Motor using Rotary Encoder and Display Angle on LCD
Download and resource page https://robojax.com/RJT453
* Watch full details video: https://youtu.be/6xVLbNlmK-g
This video is part of Arduino Step by Step Course which starts here: https://youtu.be/-6qSrDUA5a8
If you found this tutorial helpful, please support me so I can continue creating
content like this. Make a donation using PayPal by credit card https://bit.ly/donate-robojax
* 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 downloaded 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/>.
* Updated by Ahmad Shamshiri on Jan 23, 2022
* Encoder Library - Basic Example
* http://www.pjrc.com/teensy/td_libs_Encoder.html
*
* This example code is in the public domain.
*/
const int SW_PIN = 4;//define a pin for rotary encode switch
const int PIN_A =2;
const int PIN_B =3;
#include <Encoder.h>
// Change these two numbers to the pins connected to your encoder.
// Best Performance: both pins have interrupt capability
// Good Performance: only the first pin has interrupt capability
// Low Performance: neither pin has interrupt capability
Encoder myEnc(PIN_A, PIN_B);
// avoid using pins with LEDs attached
const int homePosition = 90; //initial position
const int stepValue = 3;//how fast the servo should rotate when turning the knob
const int servoPin = 9;//~must be a pin that that is labeled with ~
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int servoAngel =homePosition;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 or 0x3F for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x3F, 16, 2);
void setup() {
Serial.begin(9600);
pinMode(SW_PIN, INPUT);
Serial.println("Robojax Encoder with LCD and Servo");
myservo.attach(servoPin); // attaches the servo on pin
myservo.write(servoAngel);//move servo to initial position
lcd.begin();
// Turn on the blacklight and print a message.
lcd.backlight();
lcd.print("Robojax Encoder");
lcd.setCursor (0,1); // go to start of 2nd line
lcd.print("Servo Test");
delay(2000);
lcd.clear();// clear previous values from screen
lcd.print("Robojax Encoder");
lcd.setCursor (0,1); // go to start of 2nd line
lcd.print("Angle: ");
}
long oldPosition = -999;
void loop() {
long newPosition = myEnc.read();
if (newPosition != oldPosition) {
if(newPosition > oldPosition)
{
int newStep = abs(newPosition - oldPosition);
Serial.print("Angle ");
Serial.println(servoAngel);
servoAngel -= stepValue;
if(servoAngel <0)
servoAngel =0;
myservo.write(servoAngel); //move servo to new angle
lcdAngel(servoAngel);//print on LCD
}
if(newPosition < oldPosition )
{
int newStep = abs(newPosition - oldPosition);
Serial.print("Angle ");
Serial.println(servoAngel);
servoAngel += stepValue;
if(servoAngel >180)
servoAngel =180;
myservo.write(servoAngel); //move servo to new angle
lcdAngel(servoAngel);//print on LCD
}
oldPosition = newPosition;//remember the new position
}
if( digitalRead(SW_PIN) == LOW)
{
Serial.print("Home: ");
Serial.println(homePosition);
servoAngel =homePosition;
myservo.write(servoAngel); //move servo to new angle
lcdAngel(servoAngel);//print on LCD
}
//delay(200);
}
/*
* lcdAngel(int angel)
* prints the angle on LCD
* written by Ahmad Shamshiri
* www.robojax.com
* Jan 27, 2022 at 13:18
* Watch full details video: https://youtu.be/6xVLbNlmK-g
*/
void lcdAngel(int angel)
{
int startChar =7;
for(int i=startChar; i<16; i++)
{
lcd.setCursor (i,1);
lcd.print(" ");
}
lcd.setCursor (startChar,1); // line 1
lcd.print(angel);
lcd.print((char)223);
}
Waad u baahan tahay
-
Amaazon
-
Amaazon
-
Amaazon
-
eBay
-
eBay
-
AliExpressPurchase an LCD1602 from AliExpresss.click.aliexpress.com
Kheyraadka & Tixraacyada
-
DibeddaPurchase an LCD1602 from AliExpresss.click.aliexpress.com
-
Dibedda
-
Dibedda
-
DibeddaPurchase ZK-5DA from Amazon UKamzn.to
Faylasha📁
Fayl la'aan.