99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何設(shè)置用于旋轉(zhuǎn)編碼器的簡單Arduino菜單

454398 ? 來源:網(wǎng)絡(luò)整理 ? 作者:網(wǎng)絡(luò)整理 ? 2020-01-29 17:43 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

步驟1:準(zhǔn)備工作

如何設(shè)置用于旋轉(zhuǎn)編碼器的簡單Arduino菜單

如果還沒有,請參閱我的其他Instructable旋轉(zhuǎn)編碼器閱讀,以了解如何設(shè)置硬件和Arduino IDE軟件。

硬件

圖片中顯示了需要使用中心按鈕的其他硬件連接。我使用Fritzing繪制了圖表,但它沒有代表最可能的引腳布局的旋轉(zhuǎn)編碼器組件,因此只需將該圖表與注釋結(jié)合使用,然后查看旋轉(zhuǎn)編碼器的照片,即可了解更多內(nèi)容??赡苷趯ふ倚D(zhuǎn)編碼器引腳布局方面的信息。

旋轉(zhuǎn)編碼器一側(cè)(與具有三個(gè)引腳的一側(cè)相對)的兩個(gè)引腳之一需要接地,而另一端則要連接到Arduino的數(shù)字引腳。我已將D4用于示例草圖。如果您選擇其他引腳,請不要忘記更改草圖中的 buttonPin 的值。

接下來是步驟2中的代碼。

步驟2:代碼

這是代碼。通過查看結(jié)構(gòu)和評論,我希望您會發(fā)現(xiàn)很容易適應(yīng)您的特定需求!

/*******Interrupt-based Rotary Encoder Menu Sketch*******

* by Simon Merrett, based on insight from Oleg Mazurov, Nick Gammon, rt and Steve Spence, and code from Nick Gammon

* 3,638 bytes with debugging on UNO, 1,604 bytes without debugging

*/

// Rotary encoder declarations

static int pinA = 2; // Our first hardware interrupt pin is digital pin 2

static int pinB = 3; // Our second hardware interrupt pin is digital pin 3

volatile byte aFlag = 0; // let‘s us know when we’re expecting a rising edge on pinA to signal that the encoder has arrived at a detent

volatile byte bFlag = 0; // let‘s us know when we’re expecting a rising edge on pinB to signal that the encoder has arrived at a detent (opposite direction to when aFlag is set)

volatile byte encoderPos = 0; //this variable stores our current value of encoder position. Change to int or uin16_t instead of byte if you want to record a larger range than 0-255

volatile byte oldEncPos = 0; //stores the last encoder position value so we can compare to the current reading and see if it has changed (so we know when to print to the serial monitor)

volatile byte reading = 0; //somewhere to store the direct values we read from our interrupt pins before checking to see if we have moved a whole detent

// Button reading, including debounce without delay function declarations

const byte buttonPin = 4; // this is the Arduino pin we are connecting the push button to

byte oldButtonState = HIGH; // assume switch open because of pull-up resistor

const unsigned long debounceTime = 10; // milliseconds

unsigned long buttonPressTime; // when the switch last changed state

boolean buttonPressed = 0; // a flag variable

// Menu and submenu/setting declarations

byte Mode = 0; // This is which menu mode we are in at any given time (top level or one of the submenus)

const byte modeMax = 3; // This is the number of submenus/settings you want

byte setting1 = 0; // a variable which holds the value we set

byte setting2 = 0; // a variable which holds the value we set

byte setting3 = 0; // a variable which holds the value we set

/* Note: you may wish to change settingN etc to int, float or boolean to suit your application.

Remember to change “void setAdmin(byte name,*BYTE* setting)” to match and probably add some

“modeMax”-type overflow code in the “if(Mode == N && buttonPressed)” section*/

void setup() {

//Rotary encoder section of setup

pinMode(pinA, INPUT_PULLUP); // set pinA as an input, pulled HIGH to the logic voltage (5V or 3.3V for most cases)

pinMode(pinB, INPUT_PULLUP); // set pinB as an input, pulled HIGH to the logic voltage (5V or 3.3V for most cases)

attachInterrupt(0,PinA,RISING); // set an interrupt on PinA, looking for a rising edge signal and executing the “PinA” Interrupt Service Routine (below)

attachInterrupt(1,PinB,RISING); // set an interrupt on PinB, looking for a rising edge signal and executing the “PinB” Interrupt Service Routine (below)

// button section of setup

pinMode (buttonPin, INPUT_PULLUP); // setup the button pin

// DEBUGGING section of setup

Serial.begin(9600); // DEBUGGING: opens serial port, sets data rate to 9600 bps

}

void loop() {

rotaryMenu();

// carry out other loop code here

}

void rotaryMenu() { //This handles the bulk of the menu functions without needing to install/include/compile a menu library

//DEBUGGING: Rotary encoder update display if turned

if(oldEncPos != encoderPos) { // DEBUGGING

Serial.println(encoderPos);// DEBUGGING. Sometimes the serial monitor may show a value just outside modeMax due to this function. The menu shouldn‘t be affected.

oldEncPos = encoderPos;// DEBUGGING

}// DEBUGGING

// Button reading with non-delay() debounce - thank you Nick Gammon!

byte buttonState = digitalRead (buttonPin);

if (buttonState != oldButtonState){

if (millis () - buttonPressTime 》= debounceTime){ // debounce

buttonPressTime = millis (); // when we closed the switch

oldButtonState = buttonState; // remember for next time

if (buttonState == LOW){

Serial.println (“Button closed”); // DEBUGGING: print that button has been closed

buttonPressed = 1;

}

else {

Serial.println (“Button opened”); // DEBUGGING: print that button has been opened

buttonPressed = 0;

}

} // end if debounce time up

} // end of state change

//Main menu section

if (Mode == 0) {

if (encoderPos 》 (modeMax+10)) encoderPos = modeMax; // check we haven’t gone out of bounds below 0 and correct if we have

else if (encoderPos 》 modeMax) encoderPos = 0; // check we haven‘t gone out of bounds above modeMax and correct if we have

if (buttonPressed){

Mode = encoderPos; // set the Mode to the current value of input if button has been pressed

Serial.print(“Mode selected: ”); //DEBUGGING: print which mode has been selected

Serial.println(Mode); //DEBUGGING: print which mode has been selected

buttonPressed = 0; // reset the button status so one press results in one action

if (Mode == 1) {

Serial.println(“Mode 1”); //DEBUGGING: print which mode has been selected

encoderPos = setting1; // start adjusting Vout from last set point

}

if (Mode == 2) {

Serial.println(“Mode 2”); //DEBUGGING: print which mode has been selected

encoderPos = setting2; // start adjusting Imax from last set point

}

if (Mode == 3) {

Serial.println(“Mode 3”); //DEBUGGING: print which mode has been selected

encoderPos = setting3; // start adjusting Vmin from last set point

}

}

}

if (Mode == 1 && buttonPressed) {

setting1 = encoderPos; // record whatever value your encoder has been turned to, to setting 3

setAdmin(1,setting1);

//code to do other things with setting1 here, perhaps update display

}

if (Mode == 2 && buttonPressed) {

setting2 = encoderPos; // record whatever value your encoder has been turned to, to setting 2

setAdmin(2,setting2);

//code to do other things with setting2 here, perhaps update display

}

if (Mode == 3 && buttonPressed){

setting3 = encoderPos; // record whatever value your encoder has been turned to, to setting 3

setAdmin(3,setting3);

//code to do other things with setting3 here, perhaps update display

}

}

// Carry out common activities each time a setting is changed

void setAdmin(byte name, byte setting){

Serial.print(“Setting ”); //DEBUGGING

Serial.print(name); //DEBUGGING

Serial.print(“ = ”); //DEBUGGING

Serial.println(setting);//DEBUGGING

encoderPos = 0; // reorientate the menu index - optional as we have overflow check code elsewhere

buttonPressed = 0; // reset the button status so one press results in one action

Mode = 0; // go back to top level of menu, now that we’ve set values

Serial.println(“Main Menu”); //DEBUGGING

}

//Rotary encoder interrupt service routine for one encoder pin

void PinA(){

cli(); //stop interrupts happening before we read pin values

reading = PIND & 0xC; // read all eight pin values then strip away all but pinA and pinB‘s values

if(reading == B00001100 && aFlag) { //check that we have both pins at detent (HIGH) and that we are expecting detent on this pin’s rising edge

encoderPos --; //decrement the encoder‘s position count

bFlag = 0; //reset flags for the next turn

aFlag = 0; //reset flags for the next turn

}

else if (reading == B00000100) bFlag = 1; //signal that we’re expecting pinB to signal the transition to detent from free rotation

sei(); //restart interrupts

}

//Rotary encoder interrupt service routine for the other encoder pin

void PinB(){

cli(); //stop interrupts happening before we read pin values

reading = PIND & 0xC; //read all eight pin values then strip away all but pinA and pinB‘s values

if (reading == B00001100 && bFlag) { //check that we have both pins at detent (HIGH) and that we are expecting detent on this pin’s rising edge

encoderPos ++; //increment the encoder‘s position count

bFlag = 0; //reset flags for the next turn

aFlag = 0; //reset flags for the next turn

}

else if (reading == B00001000) aFlag = 1; //signal that we’re expecting pinA to signal the transition to detent from free rotation

sei(); //restart interrupts

}

// end of sketch!

在任何對菜單執(zhí)行操作都不重要的行的每個(gè)注釋的開頭,我都使用了“ DEBUGGING”。如果您對菜單功能滿意,則可能需要注釋掉或刪除這些行以縮小編譯的草圖尺寸。

請注意,菜單導(dǎo)航的關(guān)鍵部分是在用戶滾動(dòng)瀏覽選項(xiàng)和設(shè)置時(shí)反饋給用戶。因此,如果您選擇不包括DEBUGGING行,則可能應(yīng)該使用另一個(gè)可視指示器(例如LCD文本顯示器,LED),編碼器輸入正在導(dǎo)航菜單并更改設(shè)置。

如果我注釋掉DEBUGGING行(注意,菜單導(dǎo)航仍需要一些視覺反饋),Arduino Uno的編譯后代碼約為1,650字節(jié),希望在ATMEGA328P上留出足夠的空間以容納草圖中更令人興奮的部分!

轉(zhuǎn)到步驟3,了解菜單系統(tǒng)的工作原理。

步驟3:操作和結(jié)論

操作

如果上傳此草圖后在Arduino中打開串行監(jiān)視器,并開始轉(zhuǎn)動(dòng)編碼器軸,則應(yīng)該看到頂層菜單在子菜單/選項(xiàng)數(shù)中旋轉(zhuǎn)您擁有(使用 modeMax 變量進(jìn)行限制)。如果按中間的按鈕,您會看到已選擇要滾動(dòng)到的模式/子菜單,現(xiàn)在可以自由選擇要滾動(dòng)瀏覽該子菜單中的0-255值?,F(xiàn)在,如果您按下中央按鈕,則將其設(shè)置為 setting1 或 setting2 或 setting3 等。Arduino自動(dòng)并立即返回

上電后,Arduino會記住您將每個(gè)設(shè)置設(shè)置為什么,并且如果您返回子菜單以獲取設(shè)置,則您已經(jīng)設(shè)置了一個(gè)值到此為止,它將從您選擇的最后一個(gè)值開始進(jìn)行編碼器調(diào)整!

結(jié)論

我著手編寫一些基于草圖的代碼,旋轉(zhuǎn)編碼器導(dǎo)航Arduino的基本菜單。我還嘗試使其具有可讀性,以便與某些替代方案不同,有人可以看到菜單結(jié)構(gòu),并知道他們需要進(jìn)行哪些更改才能根據(jù)自己的需要定制菜單。

此代碼是基本的和通用的,專門用于演示功能,同時(shí)易于適應(yīng)您自己的應(yīng)用程序。它使用串行監(jiān)視器作為基本的調(diào)試工具,如果您想查看代碼的工作原理,也不需要單獨(dú)顯示。希望您發(fā)現(xiàn)它有用,并受到啟發(fā)進(jìn)行編輯,修改和改進(jìn)!

責(zé)任編輯:wv

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 編碼器
    +關(guān)注

    關(guān)注

    45

    文章

    3796

    瀏覽量

    138019
  • Arduino
    +關(guān)注

    關(guān)注

    190

    文章

    6498

    瀏覽量

    192134
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    一文讀懂什么是磁性編碼器

    磁性編碼器是一種用于測量角度和線性位置的傳感。它使用磁性信號來監(jiān)測旋轉(zhuǎn)或線性位置的變化,并把這些變化轉(zhuǎn)換成數(shù)字信號。磁性編碼器
    的頭像 發(fā)表于 04-27 17:18 ?298次閱讀

    旋轉(zhuǎn)編碼器在永磁同步電機(jī)位置測量中的應(yīng)用(可下載)

    旋轉(zhuǎn)編碼器能夠滿足高精度、高可靠性、低成本的設(shè)計(jì)要求。 那么將 AS5040 磁旋轉(zhuǎn)編碼器應(yīng)用于永磁同步電機(jī)位置檢測時(shí),需要解決兩個(gè)問題
    發(fā)表于 04-09 13:37 ?0次下載

    編碼器與無軸承編碼器,到底如何選擇?

    : ? ?● 通常包含光傳感和光柵。當(dāng)軸旋轉(zhuǎn)時(shí),光柵會中斷傳感的光路,產(chǎn)生電脈沖,從而進(jìn)行角度測量。 ? ?● 內(nèi)部軸承通常較小,不適合重載。編碼器連接的軸必須沿其軸線對中,以免與
    的頭像 發(fā)表于 03-11 15:33 ?460次閱讀
    軸<b class='flag-5'>編碼器</b>與無軸承<b class='flag-5'>編碼器</b>,到底如何選擇?

    磁環(huán)編碼器:精準(zhǔn)定位與高效旋轉(zhuǎn)控制的創(chuàng)新解決方案

    在當(dāng)今高度自動(dòng)化與智能化的工業(yè)領(lǐng)域,每一個(gè)微小的運(yùn)動(dòng)控制都承載著關(guān)鍵的任務(wù)與期望。磁環(huán)編碼器,作為旋轉(zhuǎn)位置檢測領(lǐng)域的明星產(chǎn)品,正以其卓越的性能、高精度的定位能力以及對惡劣環(huán)境的適應(yīng)性,引領(lǐng)著旋轉(zhuǎn)控制
    的頭像 發(fā)表于 02-28 08:54 ?429次閱讀

    DISCOAA編碼器類型功能

    根據(jù)編碼器的通用分類,我們可以推斷DISCOAA編碼器可能也包括絕對編碼器和增量編碼器。絕對編碼器能夠提供每個(gè)
    的頭像 發(fā)表于 02-20 13:47 ?338次閱讀

    用于 SPI 絕對編碼器Arduino 示例代碼

    (SPI) 通信來配置和讀取 [Same Sky] 的 [AMT22 絕對編碼器] 的數(shù)據(jù)。該教程將提供所需的硬件和軟件、關(guān)鍵設(shè)置要求以及單圈和多圈輸出選項(xiàng)的示例代碼包和說明。以下是入門工作所需的物料清單
    的頭像 發(fā)表于 01-26 21:35 ?804次閱讀
    <b class='flag-5'>用于</b> SPI 絕對<b class='flag-5'>編碼器</b>的 <b class='flag-5'>Arduino</b> 示例代碼

    編碼器種類大觀:探索技術(shù)前沿與應(yīng)用創(chuàng)新

    在工業(yè)自動(dòng)化、機(jī)器人技術(shù)、航空航天以及眾多精密制造領(lǐng)域,編碼器作為位置、速度或方向反饋的關(guān)鍵組件,扮演著舉足輕重的角色。隨著技術(shù)的不斷進(jìn)步,編碼器的種類日益豐富,從基礎(chǔ)的旋轉(zhuǎn)編碼器到先
    的頭像 發(fā)表于 11-21 08:49 ?1285次閱讀

    二進(jìn)制編碼器與絕對編碼器的區(qū)別

    編碼器是工業(yè)自動(dòng)化和機(jī)器人技術(shù)中不可或缺的組件,用于將機(jī)械位置或運(yùn)動(dòng)轉(zhuǎn)換為電信號。二進(jìn)制編碼器和絕對編碼器是兩種常見的編碼器類型,它們各自有
    的頭像 發(fā)表于 11-06 09:54 ?1288次閱讀

    增量式編碼器單圈和多圈怎么知道,如何分辯?

    增量式編碼器單圈和多圈怎么知道,如何分辯? 單圈編碼器特點(diǎn): ? 單圈編碼器只能測量一圈內(nèi)的旋轉(zhuǎn)角度或位移。一旦旋轉(zhuǎn)超過一圈,數(shù)據(jù)就會重新
    的頭像 發(fā)表于 10-21 09:42 ?1025次閱讀
    增量式<b class='flag-5'>編碼器</b>單圈和多圈怎么知道,如何分辯?

    旋轉(zhuǎn)編碼器的類型以及選擇與設(shè)計(jì)注意要點(diǎn)

    應(yīng)用中,需要準(zhǔn)確測量旋轉(zhuǎn)物體的角度,旋轉(zhuǎn)編碼器可以提供高精度的角度信息,用于導(dǎo)航、定位和控制系統(tǒng)。此外,通過監(jiān)測旋轉(zhuǎn)
    的頭像 發(fā)表于 10-02 16:52 ?778次閱讀
    <b class='flag-5'>旋轉(zhuǎn)</b><b class='flag-5'>編碼器</b>的類型以及選擇與設(shè)計(jì)注意要點(diǎn)

    旋轉(zhuǎn)編碼器可以收集并發(fā)出什么信號,旋轉(zhuǎn)編碼器信號異常怎么處理

    旋轉(zhuǎn)編碼器是一種精密的測量裝置,主要用于旋轉(zhuǎn)運(yùn)動(dòng)轉(zhuǎn)換為可測量的電信號。它可以收集并發(fā)出多種信號,但主要的是與旋轉(zhuǎn)運(yùn)動(dòng)相關(guān)的位置、速度或角度
    的頭像 發(fā)表于 10-01 16:55 ?1599次閱讀

    如何實(shí)現(xiàn)比較以提高工業(yè)驅(qū)動(dòng)應(yīng)用中旋轉(zhuǎn)編碼器的性能

    電子發(fā)燒友網(wǎng)站提供《如何實(shí)現(xiàn)比較以提高工業(yè)驅(qū)動(dòng)應(yīng)用中旋轉(zhuǎn)編碼器的性能.pdf》資料免費(fèi)下載
    發(fā)表于 09-19 13:09 ?0次下載
    如何實(shí)現(xiàn)比較<b class='flag-5'>器</b>以提高工業(yè)驅(qū)動(dòng)應(yīng)用中<b class='flag-5'>旋轉(zhuǎn)</b><b class='flag-5'>編碼器</b>的性能

    增量旋轉(zhuǎn)編碼器

    電子發(fā)燒友網(wǎng)站提供《增量旋轉(zhuǎn)編碼器.pdf》資料免費(fèi)下載
    發(fā)表于 09-03 11:51 ?2次下載
    增量<b class='flag-5'>旋轉(zhuǎn)</b><b class='flag-5'>編碼器</b>

    編碼器有什么分類?

    編碼器本質(zhì)是一種用于運(yùn)動(dòng)控制的傳感,作用在于測量機(jī)械旋轉(zhuǎn)的位移。
    的頭像 發(fā)表于 08-10 14:47 ?1110次閱讀

    編碼器有哪些類型? 編碼器如何選適合自己產(chǎn)品的型號?

    介紹編碼器的有關(guān)知識。? 編碼器:通常用于精確測量線性或旋轉(zhuǎn)運(yùn)動(dòng)。從它們的結(jié)構(gòu)方式到通訊方式,不同類型的應(yīng)用場景是有不同差距的。 ? HCJD-6系列非接觸式角度
    的頭像 發(fā)表于 08-09 09:00 ?1513次閱讀