Sử dụng Arduino điều khiển xe mô hình

Mình làm luận văn thạc sĩ Hệ thống thông tin về: Xây dựng hệ thống điều khiển thiết bị bằng thiết bị Epoc Emotiv trong đó có 1 phần trong thực hành đó là dùng Arduino điều khiển xe mô hình.

Cụ thể máy tính sẽ thực hiện phát lệnh tiến lui, rẽ phải trái tới xe mô hình thông qua thiết bị Arduino.

Thiết bị mình sử dụng:

– Bo mạch Arduino hoặc là Wemos R1
– Module cầu H điều khiển 2 motor L298N
– Motor động cơ giảm tốc DC

Trong quá trình mình triển khai thì mình không tài nào có thể điều khiển được motor quay theo chiều ngược lại. Ban đầu mình đấu có phần sai nhưng đó không phải là tất cả. Đấu sai nhưng vẫn quay được motor nhưng chỉ quay 1 chiều duy nhất.

Sau đó lỗi xác định có thể do việc cắm dây không đúng. Trong quá trình hỏi ở các nhóm trên Facebook và nơi bán mạch cầu H thì mình đã khắc phục được và mọi người khẳng định có thể chạy được.

Nhưng thực sự nó vẫn không chạy được như ý muốn, nó vẫn chỉ quay 1 chiều duy nhất.
Cuối cùng buộc phải mang đến quán bán cái mạch cầu H để nhờ họ xem, xem đi xem lại mãi mới phát hiện ra là do sợi dây đực cái bị đứt ngầm. Chỉ một sợi dây đứt ngầm mà dự án bị chậm mấy tháng. Nó làm mình mất ăn mất ngủ bao nhiêu hôm, không bao giờ nghĩ được ra là do sợi dây.

Cuối cùng vấn đề đã được giải quyết, mặc dù chưa cho chạy được nhưng mấu chốt đã được giải quyết, điều khiển được motor quay ngược quay xuôi thì sẽ làm được tiếp theo.

– Cách đấu mạch

+ Hai pin Ultrafire mỗi pin 3.7V, cực dương đấu vào chân 12V của mạch cầu H, cực âm đấu vào chân GND của mạch cầu H

+ Chân +5V và chân GND của mạch cầu H đấu sang cấp nguồn cho Arduino

+ 4 đường IN 1,2,3,4 của mạch cầu H nối với cổng ra 6,7,8,9 của Arduino(có thể 3,4,5,6…)

+ 4 đường OUT của mạch cầu H nối ra các cực của 2 động cơ tương ứng

– Code test

+ Quay xuôi

void setup()
{
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
}
void loop()
{
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
delay(10000);//dừng 10s
}

+ Quay ngược

void setup()
{
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
}
void loop()
{
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
delay(10000);//dừng 10s
}

 

Rất cám ơn sự hỗ trợ từ cộng đồng IOT cũng như nơi bán sản phẩm linhkietviet.vn. Thực sự mình cũng chịu khó tìm tòi chứ không phải động tí là hỏi, nhưng thực sự ca này là ca thực sự khó đỡ nhất và là bài học kinh nghiệm đáng giá. Các bạn đã hỗ trợ mình hết sức nhiệt tình, từ đây mình có thêm niềm tiên và cố gắng hỗ trợ ngược lại người khác nếu có thể.

Lưu trữ và backup sự thay đổi của các package của hệ thống ORACLE (hoặc procedure, function…)

Lưu trữ và backup sự thay đổi của các package của hệ thống ORACLE (hoặc procedure, function…)

Đứng vai trò là một Delevlop Database, trong Database công ty sẽ có rất nhiều các pakage, các package này cũng không chỉ có mỗi một mình sửa mà cả team cùng sửa. Cũng giống như code, việc này hay xảy ra conflic khi build gây lỗi cả hệ thống.

Hoặc đơn giản hơn, trước khi sửa ta luôn phải lưu package lại trước khi sửa. Vì nhiều lúc không phải lúc nào cũng có hệ thống test để có thể làm việc được.

Để tự động hóa việc lưu trữ cũng như lưu được lịch sử sửa đổi package, mình sẽ thực hiện 1 tiến trình như sau:
– Bước 1: hàng ngày hoặc nửa ngày 1 lần, tiến hành extract từng package ra 1 file sql hoặc text để tiến hành lưu trữ
– Bước 2: Hoặc là lưu trữ toàn bộ lại theo từng lần. Hoặc tiến hành đưa vào source quản lý mã nguồn.
Từ đây ta có thể dễ dàng tra cứu lại hoặc tiến hành khôi phục lại (rollback) code sql mà ta có thể đã làm lỗi gì đó.

Đây là 1 procedure mà mình đã tạo:
– Lấy toàn bộ các package có tên bắt đầu P_VN để tiến hành backup
– Lấy mã nguồn từng package lưu vào file có tên là tên package và lưu trữ vào thư mục: EXTRACT_2018 (tên biến trong oracle maps vào ổ cứng, mình đã có 1 bài viết về cái này, bạn có thể xem tại: …)

CREATE OR REPLACE PROCEDURE pro_flat_export
IS
l_clob CLOB;
l_name VARCHAR2(300);
rc sys_refcursor;
l_buffer VARCHAR2 (32767);
l_amount BINARY_INTEGER := 32767;
l_pos INTEGER := 1;
wquery varchar2(3000);
col1 varchar2(500);
cursor c_getdata is
SELECT OBJECT_NAME FROM ALL_OBJECTS WHERE OBJECT_TYPE IN (‘PACKAGE’) and OBJECT_NAME like ‘P_VN%’;
BEGIN
for i_getdata in c_getdata loop
col1:=i_getdata.OBJECT_NAME;
select dbms_metadata.get_ddl(‘PACKAGE’,col1,USER) into l_clob from dual;
DBMS_XSLPROCESSOR.clob2file (l_clob, ‘EXTRACT_2018′, col1||’.sql’);
end loop;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line (SQLERRM);
END;

Ta có thể chạy định kỳ thủ tục này hoặc cần thì chạy:
begin
pro_flat_export();
end;

Ý tưởng để quản lý mã nguồn giống như quản lý mã nguồn cho code lập trình, ta sử dụng SVN hoặc GIT.
Ta tạo GIT bình thường, khi chạy tạo ra các file mới này ta đẩy vào thư mục GIT để thay thế code cũ. Sau đó tiến hành commit lên thôi, vì đây ta lưu ra txt hoặc sql nên có xem lại được theo version.