10. Tạo ra các dạng sóng lặp lại
11.3 Bộ đếm lê n/ xuống
Thật đơn giản khi kết hợp hai phương pháp này để tạo ra một thiết bị có khả năng đếm hoặc xuống, như thể hiện trong ví dụ bên dưới
#include <plcLib.h>
/* Programmable Logic Controller Library for the Arduino and Compatibles Up-down Counter - Counts up or down in the range 0-10
Count up input - switch connected to input X0 (Arduino pin A0) Count down input - switch connected to input X1 (Arduino pin A1) Clear input - switch connected to input X2 (Arduino pin A2) Preset input - switch connected to input X3 (Arduino pin A3) Lower Q output - LED connected to output Y0 (Arduino pin 3) Upper Q output - LED connected to output Y1 (Arduino pin 5)
Software and Documentation:
http://www.electronics-micros.com/software-hardware/plclib-arduino/
*/
Counter ctr(10); // Counts up or down in range 0-10, starting at zero unsigned long TIMER0 = 0; // Define variable used to hold timer 0 elapsed time
unsigned long TIMER1 = 0; // Define variable used to hold timer 1 elapsed time
void setup() {
setupPLC(); // Setup inputs and outputs }
void loop() {
in(X0); // Read Input 0
timerOn(TIMER0, 10); // 10 ms switch debounce delay ctr.countUp(); // Count up
in(X1); // Read Input 1
timerOn(TIMER1, 10); // 10 ms switch debounce delay ctr.countDown(); // Count down
in(X2); // Read input X1
ctr.clear(); // Clear counter (counter at lower limit) in(X3); // Read input X2
ctr.preset(); // Preset counter (counter at upper limit) ctr.lowerQ(); // Display Count Down output on Y0 out(Y0);
ctr.upperQ(); // Display Count Up output on Y1 out(Y1); }
Listing 21. Bộ đếm lên xuống. (Source: File > Examples > plcLib > Counters>
CountUpDown)
Bộ đếm trên có các đầu vào đếm ngược và đếm ngược riêng biệt được liên kết với đầu vào các công tắc X0 và X1 tương ứng, và mỗi đầu vào bộ đếm có đầu vào công tắc gỡ lỗi riêng của nó.
Đầu ra của bộ đếm được kích hoạt khi số lượng xung xác định đã được phát hiện, nhưng giá trị đếm nội bộ thường không được hiển thị cho người dùng. Trên thực tế, bộ đếm là ' finished' hoặc ‘not finished '. Đôi khi có thể hữu ích khi xem số lượng nội bộ cho mục đích gỡ lỗi, như được hiển thị trong ví dụ sau đây.
#include <plcLib.h>
/* Programmable Logic Controller Library for the Arduino and Compatibles Up-down Counter - Counts up or down in the range 0-10
(Sends current count to serial monitor)
Connections:
Count up input - switch connected to input X0 (Arduino pin A0) Count down input - switch connected to input X1 (Arduino pin A1)
Clear input - switch connected to input X2 (Arduino pin A2) Preset input - switch connected to input X3 (Arduino pin A3)
Lower Q output - LED connected to output Y0 (Arduino pin 3) Upper Q output - LED connected to output Y1 (Arduino pin 5) Software and Documentation:
http://www.electronics-micros.com/software-hardware/plclib-arduino/
*/
Counter ctr(10); // Counts up or down in range 0-10, starting at zero unsigned long TIMER0 = 0; // Define variable used to hold timer 0 elapsed time unsigned long TIMER1 = 0; // Define variable used to hold timer 1 elapsed time
void setup() {
setupPLC(); // Setup inputs and outputs Serial.begin(9600); // Open serial connection over USB }
void loop() {
in(X0); // Read Input 0
timerOn(TIMER0, 10); // 10 ms switch debounce delay ctr.countUp(); // Count up
in(X1); // Read Input 1
timerOn(TIMER1, 10); // 10 ms switch debounce delay ctr.countDown(); // Count down
in(X2); // Read input X1
ctr.clear(); // Clear counter (counter at lower limit) in(X3); // Read input X2
ctr.preset(); // Preset counter (counter at upper limit) ctr.lowerQ(); // Display Count Down output on Y0 out(Y0);
ctr.upperQ(); // Display Count Up output on Y1 out(Y1);
Serial.println(ctr.count()); // Send count to serial port delay(100); }
Listing 22. Bộ đếm lên xuống có gỡ lỗi. (Source: File > Examples > plcLib
> Counters >CountUpDownDebug)
Để gỡ lỗi ứng dụng, chỉ cần mở Serial Monitor trong khi bản phác thảo đang chạy. Điều này sẽ lặp lại hiển thị giá trị đếm bên trong, với khoảng thời gian lặp lại được điều khiển bởi lệnh trễ hướng tới cuối danh sách. (Tuy nhiên, đừng quên xóa mã gỡ lỗi, khi ứng dụng của bạn làm việc như dự định.)
12 Dịch chuyển và xoay dữ liệu nhị phân
Phiên bản 0.9 của phần mềm giới thiệu các thanh ghi shift có thể được sử dụng để chuyển dữ liệu nhị phân sang trái hoặc bên phải, theo từng vị trí bit.
Hình 34. Một thanh ghi dịch chuyển đơn giản di chuyển dữ liệu sang một vị trí
bên phải trên mỗi cạnh lên của Đồng hồ
Ví dụ trên cho thấy một thanh ghi dịch chuyển 8 bit đơn giản, dịch chuyển dữ liệu từ một vị trí sang bên phải trên mỗi cạnh lên của đầu vào Đồng hồ. Dữ liệu mới được chuyển sang ở phía bên trái, trong khi dữ liệu bị loại bỏ vì nó lá ở bên phải. Nội dung của các bit riêng lẻ có thể được đọc từ các kết nối đầu ra ở trên cùng.
Xét nội dung số của thanh ghi dịch chuyển, việc chuyển dữ liệu sang bên phải tương đương với phép chia bằng hai, vì bit quan trọng nhất nằm ở bên trái. Ngược lại, dịch chuyển sang trái sẽ tương đương với nhân với hai.
12.1 Tạo và sử dụng sổ đăng ký Shift
Bước đầu tiên là sử dụng lệnh Shift để tạo một đối tượng thanh ghi shift, có độ rộng dữ liệu cố định 16-bit. Nội dung ban đầu của sổ đăng ký có thể được thiết lập tùy ý khi tạo. Ví dụ: Lệnh Shift shift1 (0x8888); tạo một đối tượng thanh ghi shift gọi là shift1 với hệ thập lục phân ban đầu nội dung của 0x8888, tương đương với 1000 1000 1000 1000 trong hệ nhị phân..
Một số tác vụ cấu hình khác cũng được yêu cầu, bao gồm định nghĩa đầu vào dữ liệu nối tiếp, đồng hồ đầu vào (chuyển dữ liệu sang phải trong trường hợp này), đặt lại đầu vào và bất kỳ kết nối đầu ra song song nào, như minh họa bằng ký hiệu khối chức năng sau.
Hình 35. Biểu diễn khối chức năng của thanh ghi dịch chuyển..
Mã hóa thực tế của thanh ghi ca được đưa ra trong bản phác thảo sau.
#include <plcLib.h>
/* Programmable Logic Controller Library for the Arduino and Compatibles Shift register: Shift data to the right
Connections:
Serial Input - switch connected to input X0 (Arduino pin A0) Clock Input - switch connected to input X1 (Arduino pin A1)
Reset Input - switch connected to input X2 (Arduino pin A2 ) Output - LED connected to output Y0 (Arduino pin 3)
Output - LED connected to output Y1 (Arduino pin 5) Output - LED connected to output Y2 (Arduino pin 6) Output - LED connected to output Y3 (Arduino pin 9)
Software and Documentation: http://www.electronics-micros.com/software-hardware/plclib-arduino/
*/
Shift shift1(0x8888); // Create a 16 bit shift register with initial value 0x8888 // Bit 1 1 1 1 1 1 // Positions 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 // | | | | | | | | | | | | | | | | // X0 -> -> -> -> 1 0 0 0 -> 1 0 0 0 -> 1 0 0 0 -> 1 0 0 0 -> // | | | | // X1 -> Clock | | | | // | | | | // X2 -> Reset | | | | // // Y Y Y Y // Outputs 3 2 1 0
unsigned long TIMER0 = 0; // Define variable used for switch debounce void setup() {
setupPLC(); // Setup inputs and outputs }
void loop() {
in(X0); // Read input to shift register from X0 shift1.inputBit();
shift1.shiftRight();
in(X2); // Reset the shift register value to zero if X2 = 1 shift1.reset();
shift1.bitValue(15); // Send bit 15 value to output Y3 out(Y3);
shift1.bitValue(14); // Send bit 14 value to output Y2 out(Y2);
shift1.bitValue(13); // Send bit 13 value to output Y1 out(Y1);
shift1.bitValue(12); // Send bit 12 value to output Y0 out(Y0);
}
Listing 23. Thanh ghi Shift dịch chuyển dữ liệu sang bên phải (Source: File
> Examples > plcLib > ShiftRotate > ShiftRight)
Dữ liệu được dịch sang phải bởi cạnh lên của đầu vào đồng hồ được lấy từ một công tắc được kết nối với đầu vào X1, với dữ liệu mới được chuyển vào ở bên trái lấy từ công tắc đầu vào X0. (Lưu ý rằng vấn đề tiềm ẩn của liên hệ dội lại trên đầu vào đồng hồ được tránh bằng cách sử dụng độ trễ gỡ lỗi công tắc 10 ms.) swicth X2 cung cấp đầu vào đặt lại, xóa thanh ghi dịch chuyển về 0 khi được nhấn. Các đầu ra song song là được lấy từ bit 15â € “12, cho phép mọi dữ liệu nối tiếp mới được nhập vào đều hiển thị ngay trên đầu ra. Thật
dễ dàng để sửa đổi phác thảo trên để chuyển dữ liệu sang trái, như hình dưới đây
#include <plcLib.h>
/* Programmable Logic Controller Library for the Arduino and Compatibles Shift register: Shift data to the left
Connections:
Serial Input - switch connected to input X0 (Arduino pin A0) Clock Input - switch connected to input X1 (Arduino pin A1) Reset Input - switch connected to input X2 (Arduino pin A2) Output - LED connected to output Y0 (Arduino pin 3) Output - LED connected to output Y1 (Arduino pin 5) Output - LED connected to output Y2 (Arduino pin 6) Output - LED connected to output Y3 (Arduino pin 9)
Software and Documentation:
http://www.electronics-micros.com/software-hardware/plclib-arduino/
*/
Shift shift1(0x1111); // Create a 16 bit shift register with initial value 0x1111 // Bit 1 1 1 1 1 1
// | | | | | | | | | | | | | | | | // <- 0 0 0 1 <- 0 0 0 1 <- 0 0 0 1 <- 0 0 0 1 <- X0 // | | | | // X1 -> Clock | | | | // | | | | // X2 -> Reset | | | | // // Y Y Y Y // Outputs 3 2 1 0
unsigned long TIMER0 = 0; // Define variable used for switch debounce
void setup() {
setupPLC(); // Setup inputs and outputs }
void loop() {
in(X0); // Read input to shift register from X0 shift1.inputBit();
in(X1); // Shift Left on rising edge of input X1
timerOn(TIMER0, 10); // 10 ms switch debounce delay on X1 shift1.shiftLeft();
in(X2); // Reset the shift register value to zero if X2 = 1 shift1.reset();
shift1.bitValue(3); // Send bit 3 value to output Y3 out(Y3);
shift1.bitValue(2); // Send bit 2 value to output Y2 out(Y2);
shift1.bitValue(1); // Send bit 1 value to output Y1 out(Y1);
shift1.bitValue(0); // Send bit 0 value to output Y0 out(Y0); }
Listing 24. Thanh ghi Shift dịch chuyển dữ liệu sang trái (Source: File > Examples >
plcLib > ShiftRotate > ShiftLeft)
Sự khác biệt chính trước hết là kết nối của đồng hồ (công tắc X1) với đầu vào shiftLeft, và thứ hai là kết nối của các đầu ra song song với bit 3â € “0 của thanh ghi dịch chuyển. (Cái sau cho phép dữ liệu được dịch chuyển sang bên phải để hiển thị ngay lập tức trên các đầu ra, khi nó di chuyển sang bên trái).
12.2 Rotaing Data
Việc thêm kết nối phản hồi vào thanh ghi dịch chuyển của chúng tôi từ đầu ra đến đầu vào cho phép dữ liệu được luân chuyển trong vòng lặp liên tục, như hình dưới đây
Hình 36. Thêm kết nối phản hồi làm cho dữ liệu được xoay sang phải hoặc sang
trái trong một vòng lặp liên tục.
Trên thực tế, kết nối phản hồi có thể được lấy từ bất kỳ bit đầu ra thuận tiện nào, do đó tạo ra
mẫu bit lưu hành có độ rộng mong muốn bất kỳ. Ví dụ, bản phác thảo sau sử dụng thanh ghi shift bit 12 như kết nối phản hồi với đầu vào nối tiếp (tức là bit thứ 4 từ bên trái), để xoay một từ dữ liệu 4 bit rẽ phải..
#include <plcLib.h>
/* Programmable Logic Controller Library for the Arduino and Compatibles Shift register: Rotate data to the right
Connections:
Clock Input - switch connected to input X0 (Arduino pin A0) Reset Input - switch connected to input X1 (Arduino pin A1) Output - LED connected to output Y0 (Arduino pin 3)
Output - LED connected to output Y1 (Arduino pin 5) Output - LED connected to output Y2 (Arduino pin 6) Output - LED connected to output Y3 (Arduino pin 9)
Shift shift1(0x8000); // Create a shift register with initial value 0x8000 // Outputs Y Y Y Y 3 2 1 0 // Bit 1 1 1 1 // Positions 5 4 3 2 // // || || // X0 -> Clock -<--<--<--<-- // X1 -> Reset
setupPLC(); // Setup inputs and outputs }
void loop() {
in(X0); // Rotate Right on rising edge of input X0 timerOn(TIMER0, 10);
in(X1); // Reset the shift register value to zero if X1 = 1 shift1.bitValue(15); // Send bit 15 value to output Y3
out(Y3);
shift1.bitValue(14); // Send bit 14 value to output Y2 out(Y2);
shift1.bitValue(13); // Send bit 13 value to output Y1 out(Y1);
shift1.bitValue(12); // Send bit 12 value to output Y0 out(Y0);
}
Listing 25. Thanh ghi Shift xoay dữ liệu sang bên phải (Source: File > Examples
> plcLib > ShiftRotate >RotateRight)
Một bản phác thảo tương đương để xoay một từ dữ liệu 4 bit sang trái sẽ sử dụng bit 3 ( bit thứ 4 từ bên phải) như kết nối phản hồi, như được hiển thị trong ví dụ sau.
Listing 26. Thanh ghi Shift xoay dữ liệu sang trái (Source: File > Examples > plcLib
13 Làm việc với Analogue Signals
Lệnh inAnalog () đọc đầu vào tương tự. Điều này sau đó có thể được sử dụng để kiểm soát liên tục giá trị đầu ra thay đổi, chẳng hạn như độ sáng của đèn LED, tốc độ của động cơ hoặc vị trí của servo.Việc chia tỷ lệ đầu vào và đầu ra được thực hiện tự động bởi phần mềm plcLib.
Biến toàn cục scanValue giữ giá trị đã nhập, nằm trong phạm vi 0-1023 cho một giá trị tương tự đầu vào. Điều này được tự động điều chỉnh tỷ lệ trong phạm vi 0-255 hoặc 0- 179 khi được sử dụng để điều khiển PWM hoặc servo đầu ra, tương ứng.
13.1 Kiểm soát độ sáng của đèn LED bằng PWM
Liên kết lệnh inAnalog() với lệnh outPWM(), cho phép điều khiển đầu ra PWM từ một đầu vào tương tự. Ví dụ, bản phác thảo sau đây đọc một chiết áp được kết nối với đầu vào X0 và tạo ra dạng sóng xung lặp lại với chu kỳ nhiệm vụ thay đổi trên đầu ra Y0.
#include <plcLib.h>
/* Programmable Logic Controller Library for the Arduino and Compatibles PWM (Pulse Width Modulation) - Analogue control of a PWM output Connections:
Input - potentiometer connected to input X0 (Arduino pin A0) Output - LED connected to output Y0 (Arduino pin 3)
void setup() {
setupPLC(); // Setup inputs and outputs void loop() {
inAnalog(X0); // Read Analogue Input 0 outPWM(Y0); // Send to Output 0 as PWM waveform
Listing 27. Điều khiển tương tự của đầu ra PWM (Source: File > Examples > plcLib
> InputOutput >PWM)
13.2 Kiểm soát tốc độ và hướng của động cơ
Lá chắn động cơ Arduino dựa trên vi mạch điều khiển cầu H có sẵn trên thị trường, cho phép tốc độ và hướng của tối đa hai động cơ DC được điều khiển. Một kết nối phần cứng có thể được hiển thị bên dưới.
Figure 37. Lá chắn động cơ Arduino cho phép điều khiển tối đa hai động cơ.
Hai kênh động cơ có sẵn "Kênh A và Kênh B" và tấm chắn cũng hỗ trợ một
số lượng đầu nối đầu vào và đầu ra tương thích Tinkerkit (cộng với hai giao diện TWI / I2C thì không xem xét ở đây). Hình ảnh trên cho thấy một chiết áp tuyến tính được kết nối với chân X2 (A2), được sử dụng để điều khiển tốc độ động cơ thông qua PWM và một công tắc nghiêng điều khiển hướng động cơ, được liên kết với chân X3 (A3).
Ví dụ sau đây điều khiển tốc độ và hướng của động cơ được kết nối với Kênh A.
#include <plcLib.h>
/* Programmable Logic Controller Library for the Arduino and Compatibles Motor Channel A - Simple Motor Control on Arduino Motor Shield Channel A Connections:
Input - Speed - potentiometer connected to input X2 (Arduino pin A2) Input - Direction - switch connected to input X3 (Arduino pin A3) Output - Channel A Direction (DIRA) - Arduino pin 12
Output - Channel A PWM (PWMA) - Arduino pin 3 Output - Channel A Brake (BRAKEA) - Arduino pin 9
void setup() {
setupPLC(); // Setup inputs and outputs // Turn off Channel A Brake in(RUN);
out(BRAKEA); // Read RUN variable (0 = brake off) }
void loop() {
// Read Analog Input 2 and send to Channel A PWM inAnalog(X2);
outPWM(PWMA); // Read from potentiometer connected to Analogue Input 2 }
Listing 28. Điều khiển động cơ đơn giản trên Arduino Motor Shield Kênh A