Mục lục:

IOT123 - BỘ THEO DÕI MẶT TRỜI - BỘ ĐIỀU KHIỂN: 8 bước
IOT123 - BỘ THEO DÕI MẶT TRỜI - BỘ ĐIỀU KHIỂN: 8 bước

Video: IOT123 - BỘ THEO DÕI MẶT TRỜI - BỘ ĐIỀU KHIỂN: 8 bước

Video: IOT123 - BỘ THEO DÕI MẶT TRỜI - BỘ ĐIỀU KHIỂN: 8 bước
Video: XẠ TRỊ - BUỔI 2 ( COI MÔ TẢ BÊN DƯỚI TRƯỚC KHI XEM VIDEO) 2024, Tháng bảy
Anonim
Image
Image
IOT123 - BỘ THEO DÕI MẶT TRỜI - BỘ ĐIỀU KHIỂN
IOT123 - BỘ THEO DÕI MẶT TRỜI - BỘ ĐIỀU KHIỂN
IOT123 - BỘ THEO DÕI MẶT TRỜI - BỘ ĐIỀU KHIỂN
IOT123 - BỘ THEO DÕI MẶT TRỜI - BỘ ĐIỀU KHIỂN

Đây là một phần mở rộng của Có thể hướng dẫn

IOT123 - THIẾT BỊ THEO DÕI MẶT TRỜI - TILT / PAN, PANEL FRAME, LDR MOUNTS RIG. Ở đây chúng tôi tập trung vào bộ điều khiển của các servo và các cảm biến về vị trí của mặt trời. Điều quan trọng cần chỉ ra là thiết kế này giả định 2 MCU sẽ được sử dụng: một (3.3V 8mHz Arduino Pro Mini) cho bộ theo dõi năng lượng mặt trời và một MCU độc lập cho cảm biến / tác nhân của bạn.

Đây là Phiên bản 0.3

Thay vì xuất bản tất cả các dự án sau khi hoàn toàn hài lòng, tôi sẽ thực hành tích hợp liên tục và cung cấp một cái gì đó thường xuyên hơn, sửa đổi những gì tôi đã giao khi tôi cần. Tôi sẽ viết một hướng dẫn khác cho bộ sạc pin, _khi_ việc tối ưu hóa phần mềm / phần cứng bộ điều khiển đã hoàn tất. Tôi sẽ chỉ ra nơi cần tối ưu hóa khi chúng ta thực hiện bước này.

Một phần lý do cho cách tiếp cận này là phản hồi của khách hàng. Nếu các bạn thấy có nhu cầu hoặc có cách tiếp cận tốt hơn, xin vui lòng góp ý, nhưng lưu ý rằng tôi không thể giao hết mọi thứ và có thể không theo khung thời gian phù hợp với các bạn. Vì những giải thích này có vẻ ít liên quan hơn nên chúng sẽ bị xóa khỏi bài viết này.

Điều này bao gồm những gì:

  1. Sử dụng LDR từ Bản gốc có thể hướng dẫn để cảm nhận vị trí gần đúng của mặt trời.
  2. Di chuyển các Servos đối mặt với mặt trời.
  3. Các tùy chọn về độ nhạy của các chuyển động.
  4. Các tùy chọn cho kích thước bước khi di chuyển ra mặt trời.
  5. Các tùy chọn cho các ràng buộc góc được sử dụng trên servos.
  6. Các tùy chọn cho sự chậm trễ của các chuyển động.
  7. Giao diện I2C để cài đặt / nhận giá trị giữa các MCU.
  8. Ngủ sâu giữa các động tác.

Điều này không bao gồm những gì (và sẽ được giải quyết khi thời gian cho phép):

  1. Chỉ sử dụng điện vào ban ngày.
  2. Ghi nhớ vị trí bình minh và đến đó vào lúc hoàng hôn tắt.
  3. Tháo bộ điều chỉnh khỏi MCU.
  4. Tắt (các) đèn LED trên MCU.
  5. Định tuyến lại nguồn thông qua VCC thay vì RAW.
  6. Cung cấp các giải pháp thay thế cho việc nhấp nháy mà không cần nguồn điện được điều chỉnh từ bộ chuyển đổi USB sang Serial TTL.
  7. Màn hình điện áp pin.

MÔN LỊCH SỬ

Ngày 20 tháng 12 năm 2017 MÃ V0.1

Phiên bản ban đầu theo dõi nguồn sáng, luôn bật, không sạc

Ngày 7 tháng 1 năm 2018 MÃ V0.2

  • THAY ĐỔI PHẦN CỨNG

    • Thêm chân I2C
    • Thêm công tắc vào GND servo
    • Nhãn in trên hộp điều khiển
  • THAY ĐỔI PHẦN MỀM

    • Đọc cấu hình từ EEPROM
    • Hỗ trợ bus I2C như một nô lệ cho MCU khác (3.3V)
    • Đặt cấu hình qua I2C
    • Đặt Đã bật qua I2C
    • Nhận cấu hình qua I2C
    • Nhận thuộc tính thời gian chạy thông qua I2C (Hiện đã bật và Cường độ ánh sáng hiện tại)
    • Loại bỏ ghi nhật ký nối tiếp (nó ảnh hưởng đến giá trị I2C)

19 thg 1, 2018 MÃ V0.3

  • PHẦN CỨNG

    Đã cập nhật nhãn. Công tắc hiện được sử dụng để chọn chế độ CẤU HÌNH hoặc THEO DÕI

  • PHẦN MỀM

    • I2C chỉ được sử dụng để cấu hình
    • Bộ điều khiển đợi 5 giây trước khi bắt đầu theo dõi, cho phép di chuyển tay
    • Để sử dụng cấu hình I2C, SPDT phải ở trạng thái CONFIG khi khởi động đơn vị
    • Trong khi theo dõi chuyển động, thiết bị đang ở chế độ ngủ sâu cho giá trị cấu hình SLEEP MINUTES (mặc định là 20 phút).

Bước 1: Vật liệu và công cụ

Vật liệu và Công cụ
Vật liệu và Công cụ
Vật liệu và Công cụ
Vật liệu và Công cụ
Vật liệu và Công cụ
Vật liệu và Công cụ

Hiện đã có đầy đủ danh sách Hóa đơn Nguyên vật liệu và Nguồn.

  1. Các bộ phận được in 3D.
  2. Arduino Pro Mini 3.3V 8mHz
  3. 1 của Bảng mạch in đa năng PCB hai mặt nguyên mẫu 4x6cm (được cắt làm đôi)
  4. 1 đầu tắt 40P đực (được cắt theo kích thước).
  5. 1 tiêu đề nữ 40P tắt (được cắt theo kích thước).
  6. 4 tắt 10K 1 / 4W điện trở lại.
  7. Trèo lên dây.
  8. Hàn và Sắt.
  9. 20 vít tự khai thác đầu chảo không gỉ 4G x 6mm.
  10. 4 vít tự khai thác chìm không gỉ 4G x 6mm.
  11. 1 tắt pin LiPo 3.7V và giá đỡ (kết thúc bằng đầu nối dupont 2P).
  12. 1 tắt tiêu đề góc bên phải của 2P nam
  13. 1 công tắc SPDT tắt 3 chân 2,54mm
  14. Keo Cyanoacrylate mạnh
  15. Đầu nối 1P cái của đầu nối Dupont (1 màu xanh lam, 1 màu xanh lục).

Bước 2: Lắp ráp mạch

Lắp ráp mạch
Lắp ráp mạch
Lắp ráp mạch
Lắp ráp mạch
Lắp ráp mạch
Lắp ráp mạch

Hiện tại mạch không có Mạch phân áp (vôn kế).

  1. Cắt Bảng mạch in đa năng PCB hai mặt nguyên mẫu 4x6cm làm đôi theo trục dài.
  2. Cắt tiêu đề nam 40P thành nhiều mảnh:

    1. 2 giảm 12P
    2. 3 tắt 3P
    3. 6 tắt 2P.
  3. Cắt tiêu đề nữ 40P thành nhiều mảnh:

    1. 2 giảm 12P
    2. 1 giảm 6P
  4. Hàn 2 tắt tiêu đề 12Pfemale như hình.
  5. Dán miếng đệm đã loại bỏ khỏi đầu cắm 3P đực (bổ sung) vào mặt dưới của SPDT Switch bằng keo Cyanoacrylate
  6. Ở phía bên kia, sau đó hàn 6 đầu 2P, 2 đầu 3Pmale và công tắc SPDT như hình minh họa.
  7. Hàn 4 khỏi điện trở 10K (A, B, C, D màu đen) qua dây dẫn đến đầu cắm chân GND (# 2 màu đen) và đến chân tiêu đề A0 - A3 (# 5, # 6, # 7, # 8) sau đó qua lỗ (màu vàng) như hình (3 ảnh + 1 sơ đồ).
  8. Theo dõi 3.3V từ PIN hàn LDR PINS # 4, # 6, # 8, # 10 và luồn qua lỗ đến chân VCC của tiêu đề feamale (màu xanh lá cây).
  9. Theo dõi 3,3V ở phía đầu cái như hình (màu đỏ) hàn vào PINS # 1, # 12, # 15.
  10. Lỗ xuyên qua 3,3V trên đầu cắm RAW PIN # 1 được hàn qua mặt (màu đỏ).
  11. Theo dõi móc nối màu cam từ mã PIN số 11 qua lỗ đến mối hàn Chân cắm nữ ở phía bên kia như hình minh họa.
  12. Theo dõi và hàn dây móc màu xanh lam từ # 20 đến # 30 và từ # 31 đến # 13 và # 16.
  13. Hàn mã PIN đầu nữ # 11 đến mã PIN đầu nam # 11 xuyên qua lỗ.
  14. Chuẩn bị 2 đầu nối dupont dài 30mm với đầu cắm 1P cái (1 màu xanh lam, 1 đầu màu xanh lá cây). Dải và thiếc đầu kia.
  15. Hàn dây Dupont màu xanh lam đến # 28; hàn dây Dupont màu xanh lục đến # 29.
  16. Trên mặt trên của Arduino, hãy sửa đầu cắm cái 6P sau đó hàn.
  17. Ở mặt trên của Arduino, hãy sửa tiêu đề cái góc vuông 2P int # 29 và # 30 sau đó hàn.
  18. Ở mặt dưới của Arduino, cố định 2 trong số các chân nam 12P và 1 ngoài 3P sau đó hàn.
  19. Chèn các chân 12P đực của Arduino vào các đầu cái của PCB 12P.

Bước 3: Nhấp nháy MCU

Nhấp nháy MCU
Nhấp nháy MCU
Nhấp nháy MCU
Nhấp nháy MCU
Nhấp nháy MCU
Nhấp nháy MCU

Arduino Pro Mini được flash thuận tiện bằng cách sử dụng bộ chuyển đổi FTDI232 USB sang TTL sử dụng đầu cắm cái 6P. Xem ảnh trên để biết sự liên kết của 2 bảng.

Đảm bảo cài đặt 3.3V được chọn trên FTDI232 của bạn. Làm theo hướng dẫn tại đây bằng cách sử dụng mã bên dưới (sử dụng liên kết tới GIST).

Thư viện năng lượng thấp (đính kèm và https://github.com/rocketscream/Low-Power) cần được cài đặt.

Sau khi Arduino Pro Mini + PCB được lắp vào vỏ, nó vẫn có thể nhấp nháy khi các chân tiêu đề tiếp xúc. Chỉ cần ngắt kết nối Bộ điều khiển khỏi Khung bảng để lộ tiêu đề.

Máy theo dõi năng lượng mặt trời nghiêng với cấu hình I2C / EEPROM và chu kỳ ngủ giữa các chuyển động. Độ chính xác của thời lượng chu kỳ ngủ giảm khi thời lượng tăng lên, nhưng đủ cho mục đích này

/*
* sửa đổi từ mã
* bởi Mathias Leroy
*
* SỬA ĐỔI V0.2
** I2C CÀI ĐẶT
** CÀI ĐẶT EEPROM
** LOẠI BỎ ĐẦU RA SERIAL - I2C ẢNH HƯỞNG
** BẬT / TẮT THEO DÕI
** CHUYỂN SERVOS ĐẾN GIỚI HẠN QUA I2C
** ĐỌC CƯỜNG ĐỘ AVG HIỆN TẠI VIA I2C
* V0.3 SỬA ĐỔI
** CHUYỂN ĐỔI 2 CHẾ ĐỘ - THEO DÕI (KHÔNG I2C) và CẤU HÌNH (SỬ DỤNG I2C)
** NGỦ Ở CHẾ ĐỘ THEO DÕI (CHÍNH XÁC RẤT THẤP DO ĐẾN 8 CHUN THỨ HAI)
** DETACH / ATTACH SERVOS ON SLEEP / WAKE (TRANSISTOR ĐƯỢC SỬ DỤNG HÀNG NGÀY)
** LOẠI BỎ VỊ TRÍ BAN ĐẦU CÓ THỂ CẤU HÌNH (GIẢM CÒN)
** LOẠI BỎ DÉP CÓ THỂ CẤU HÌNH GIÂY (GIẢM CÒN)
** LOẠI BỎ / BẬT / TẮT CÓ THỂ CẤU HÌNH (REDUNDANT)
** BỎ QUA TRÌNH THEO DÕI CÓ CẤU HÌNH ĐƯỢC BẬT (SỬ DỤNG CÔNG TẮC PHẦN CỨNG)
** LOẠI BỎ THIẾT BỊ ÁP - SẼ SỬ DỤNG THÀNH PHẦN I2C RIÊNG
** THÊM ĐĂNG NHẬP SERIAL KHI KHÔNG SỬ DỤNG I2C
*/
#bao gồm
#bao gồm
#bao gồm
#bao gồm
#bao gồm
# xác địnhEEPROM_VERSION1
# defineI2C_MSG_IN_SIZE3
#definePIN_LDR_TL A0
#definePIN_LDR_TR A1
#definePIN_LDR_BR A3
#definePIN_LDR_BL A2
# xác địnhPIN_SERVO_V11
# xác địnhPIN_SERVO_H5
# defineIDX_I2C_ADDR0
# xác địnhIDX_V_ANGLE_MIN1
# defineIDX_V_ANGLE_MAX2
# defineIDX_V_SENSITIVITY3
# defineIDX_V_STEP4
# xác địnhIDX_H_ANGLE_MIN5
# defineIDX_H_ANGLE_MAX6
# defineIDX_H_SENSITIVITY7
# defineIDX_H_STEP8
# defineIDX_SLEEP_MINUTES9
# defineIDX_V_DAWN_ANGLE10
# xác địnhIDX_H_DAWN_ANGLE11
# defineIDX_DAWN_INTENSITY12 // mức trung bình của tất cả LDRS
# defineIDX_DUSK_INTENSITY13 // mức trung bình của tất cả LDRS
# defineIDX_END_EEPROM_SET14
# defineIDX_CURRENT_INTENSITY15 // mức trung bình của tất cả LDRS - được sử dụng để tính IDX_DAWN_INTENSITY ánh sáng xung quanh không trực tiếp
# defineIDX_END_VALUES_GET16
# defineIDX_SIGN_117
# defineIDX_SIGN_218
# defineIDX_SIGN_319
Servo _servoH;
Servo _servoV;
byte _i2cVals [20] = {10, 10, 170, 20, 5, 10, 170, 20, 5, 20, 40, 10, 30, 40, 0, 0, 0, 0, 0, 0};
int _servoLoopDelay = 10;
int _slowingDelay = 0;
int _angleH = 90;
int _angleV = 90;
int _averageTop = 0;
int _averageRight = 0;
int _averageBottom = 0;
int _averageLeft = 0;
byte _i2cResponse = 0;
bool _inConfigMode = false;
voidsetup ()
{
Serial.begin (115200);
getFromEeprom ();
if (inConfigMode ()) {
Serial.println ("Chế độ cấu hình");
Serial.print ("Địa chỉ I2C:");
Serial.println (_i2cVals [IDX_I2C_ADDR]);
Wire.begin (_i2cVals [IDX_I2C_ADDR]);
Wire.onReceive (nhậnEvent);
Wire.onRequest (requestEvent);
}khác{
Serial.println ("Chế độ theo dõi");
delay (5000); // thời gian để sử dụng nếu kết nối pin, v.v.
}
}
voidloop ()
{
getLightValues ();
if (! _inConfigMode) {
// Việc cần làm: BẬT CÔNG TẮC TRANSISTOR
_servoH.attach (PIN_SERVO_H);
_servoV.attach (PIN_SERVO_V);
for (int i = 0; i <20; i ++) {
nếu (i! = 0) {
getLightValues ();
}
moveServos ();
}
chậm trễ (500);
_servoH.detach ();
_servoV.detach ();
// Việc cần làm: TẮT CÔNG TẮC TRANSISTOR
chậm trễ (500);
SleepFor ((_ i2cVals [IDX_SLEEP_MINUTES] * 60) / 8);
}
}
//---------------------------------CHẾ ĐỘ HIỆN HÀNH
boolinConfigMode () {
mã pin (PIN_SERVO_H, INPUT);
_inConfigMode = digitalRead (PIN_SERVO_H) == 1;
return _inConfigMode;
}
// --------------------------------- EEPROM
voidgetFromEeprom () {
nếu như(
EEPROM.read (IDX_SIGN_1)! = 'S' ||
EEPROM.read (IDX_SIGN_2)! = 'T' ||
EEPROM.read (IDX_SIGN_3)! = EEPROM_VERSION
) EEPROM_write_default_configuration ();
EEPROM_read_configuration ();
}
voidEEPROM_write_default_configuration () {
Serial.println ("EEPROM_write_default_configuration");
for (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
EEPROM.update (i, _i2cVals );
}
EEPROM.update (IDX_SIGN_1, 'S');
EEPROM.update (IDX_SIGN_2, 'T');
EEPROM.update (IDX_SIGN_3, EEPROM_VERSION);
}
voidEEPROM_read_configuration () {
Serial.println ("EEPROM_read_configuration");
for (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
_i2cVals = EEPROM.read (i);
//Serial.println(String(i) + "=" + _i2cVals );
}
}
// --------------------------------- I2C
voidreceiveEvent (int count) {
nếu (đếm == I2C_MSG_IN_SIZE)
{
char cmd = Wire.read ();
chỉ mục byte = Wire.read ();
giá trị byte = Wire.read ();
chuyển đổi (cmd) {
case'G ':
nếu (chỉ mục <IDX_END_VALUES_GET) {
_i2cResponse = _i2cVals [chỉ mục];
}
nghỉ;
các trường hợp':
nếu (chỉ mục <IDX_END_EEPROM_SET) {
_i2cVals [index] = giá trị;
EEPROM.update (index, _i2cVals [index]);
}
nghỉ;
vỡ nợ:
trở lại;
}
}
}
voidrequestEvent ()
{
Wire.write (_i2cResponse);
}
// --------------------------------- LDR
voidgetLightValues () {
int valueTopLeft = analogRead (PIN_LDR_TL);
int valueTopRight = analogRead (PIN_LDR_TR);
int valueBottomRight = analogRead (PIN_LDR_BR);
int valueBottomLeft = analogRead (PIN_LDR_BL);
_averageTop = (valueTopLeft + valueTopRight) / 2;
_averageRight = (valueTopRight + valueBottomRight) / 2;
_averageBottom = (valueBottomRight + valueBottomLeft) / 2;
_averageLeft = (valueBottomLeft + valueTopLeft) / 2;
int avgIntensity = (valueTopLeft + valueTopRight + valueBottomRight + valueBottomLeft) / 4;
_i2cVals [IDX_CURRENT_INTENSITY] = map (avgIntensity, 0, 1024, 0, 255);
}
// --------------------------------- SERVOS
voidmoveServos () {
Serial.println ("moveServos");
if ((_averageLeft-_averageRight)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH-_i2cVals [IDX_H_STEP])> _ i2cVals [IDX_H_ANGLE_MIN]) {
// đi sang trái
Serial.println ("moveServos đi sang trái");
trì hoãn (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH--);
trì hoãn (_servoLoopDelay);
}
}
elseif ((_averageRight-_averageLeft)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH + _i2cVals [IDX_H_STEP]) <_ i2cVals [IDX_H_ANGLE_MAX]) {
// đi đúng
Serial.println ("moveServos đi sang trái");
trì hoãn (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH ++);
trì hoãn (_servoLoopDelay);
}
}
khác {
// Không làm gì cả
Serial.println ("moveServos không làm gì cả");
trì hoãn (_slowingDelay);
}
if ((_averageTop-_averageBottom)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV + _i2cVals [IDX_V_STEP]) <_ i2cVals [IDX_V_ANGLE_MAX]) {
// đi lên
Serial.println ("moveServos đang đi lên");
trì hoãn (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV ++);
trì hoãn (_servoLoopDelay);
}
}
elseif ((_averageBottom-_averageTop)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV-_i2cVals [IDX_V_STEP])> _ i2cVals [IDX_V_ANGLE_MIN]) {
// đi xuống
Serial.println ("moveServos đang đi xuống");
trì hoãn (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV--);
trì hoãn (_servoLoopDelay);
}
}
khác {
Serial.println ("moveServos không làm gì cả");
trì hoãn (_slowingDelay);
}
}
//---------------------------------NGỦ
voidasleepFor (unsignedint EightSecondSe mảnh) {
Serial.println ("SleepFor");
cho (unsignedint sleepCounter = EightSecondSe mảnh; sleepCounter> 0; sleepCounter--)
{
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
}
}

xem rawtilt_pan_tracker_0.3.ino được lưu trữ bằng ❤ bởi GitHub

Bước 4: Lắp ráp vỏ mạch

Lắp ráp vỏ mạch
Lắp ráp vỏ mạch
Lắp ráp vỏ mạch
Lắp ráp vỏ mạch
Lắp ráp vỏ mạch
Lắp ráp vỏ mạch
  1. Đảm bảo Ardiuno Pro Mini được lắp vào các tiêu đề trên PCB.
  2. Chèn đế hộp bộ điều khiển SOLAR TRACKER vào thành hộp bộ điều khiển SOLAR TRACKER và gắn 2 vít tự khai thác chìm không gỉ 4G x 6mm.
  3. Chèn Ardiuno Pro Mini + PCB với Tiêu đề 6P khía vào khoảng trống trong đế hộp bộ điều khiển SOLAR TRACKER.
  4. Chèn nắp hộp bộ điều khiển SOLAR TRACKER vào thành hộp bộ điều khiển SOLAR TRACKER và gắn 2 vít tự khai thác chìm không gỉ 4G x 6mm.
  5. Gắn cụm trên vào đế của Khung bảng bằng 4 vít tự khai thác chìm không gỉ 4G x 6mm.

Bước 5: Kết nối giàn khoan với bộ điều khiển

Kết nối giàn khoan với bộ điều khiển
Kết nối giàn khoan với bộ điều khiển
Kết nối giàn khoan với bộ điều khiển
Kết nối giàn khoan với bộ điều khiển
Kết nối giàn khoan với bộ điều khiển
Kết nối giàn khoan với bộ điều khiển

Các kết nối thích hợp đã sẵn sàng từ Bản hướng dẫn trước, là 4 kết nối 2P tắt 2P LDR và 2 kết nối 3P tắt từ servos. Điều gì là tạm thời cho đến khi sạc lại sẵn sàng là pin. Sử dụng LiPo 3.7V kết thúc trong kết nối DuPont 2P ngay bây giờ.

  1. Chèn các kết nối LDR (không phân cực) từ trên xuống:

    1. Trên cùng bên phải
    2. Trên cùng bên trái
    3. Góc phải ở phía dưới
    4. Dưới cùng bên trái
  2. Chèn các kết nối Servo (với dây tín hiệu ở bên trái) từ trên xuống:

    1. Nằm ngang
    2. Thẳng đứng
  3. CHỜ ĐẾN KHI SN SÀNG ĐỂ KIỂM TRA SAU ĐÓ: Chèn dây dẫn Nguồn DC 3.7V + ve lên trên cùng, -ve xuống dưới cùng.

Bước 6: Kiểm tra bộ điều khiển

Image
Image

Như đã nêu trước đây, phần mềm chưa được tối ưu hóa cho quy trình công việc Sạc bằng năng lượng mặt trời. Tuy nhiên, nó có thể được kiểm tra và điều chỉnh bằng cách sử dụng các nguồn sáng tự nhiên (mặt trời) và không tự nhiên.

Để kiểm tra theo dõi trong môi trường được kiểm soát, có thể thuận tiện để đặt PHÚT NGỦ thành giá trị thấp hơn (xem bước tiếp theo).

Bước 7: Định cấu hình Qua I2C bằng Đầu vào Bảng điều khiển

Điều này giải thích việc định cấu hình bộ điều khiển thông qua MCU thứ hai, nhập cài đặt vào cửa sổ bảng điều khiển.

  1. Tải tập lệnh sau lên D1M WIFI BLOCK (hoặc Wemos D1 Mini).
  2. Ngắt kết nối USB khỏi PC
  3. KẾT NỐI PIN: -ve (Bộ điều khiển) => GND (D1M) + ve (Bộ điều khiển) => 3V3 (D1M) SCL (Bộ điều khiển) => D1 (D1M)

    SDA (Bộ điều khiển) => D2 (D1M)

  4. Chuyển công tắc SPDT sang CONFIG
  5. Kết nối USB với PC
  6. Từ Arduino IDE, bắt đầu một cửa sổ bảng điều khiển với đúng Cổng COM
  7. Đảm bảo rằng "Dòng mới" và "9600 baud" được chọn
  8. Các lệnh được nhập vào Hộp văn bản gửi, sau đó là phím Enter
  9. Các lệnh có định dạng byte Ký tự byte
  10. Nếu byte thứ hai (phân đoạn thứ ba) không được bao gồm thì 0 (không) được gửi bởi tập lệnh
  11. Hãy cẩn thận khi sử dụng đầu vào nối tiếp; xem lại những gì bạn đã nhập trước khi nhấn phím "Enter". Nếu bạn bị khóa (ví dụ: thay đổi địa chỉ I2C thành một giá trị mà bạn đã quên), bạn sẽ cần phải flash lại chương trình cơ sở điều khiển.

Các biến thể được hỗ trợ trong ký tự đầu tiên của lệnh là:

  • E (Bật theo dõi servo) hữu ích để dừng chuyển động trong quá trình cấu hình. Đây là đầu vào sử dụng: E 0
  • D (Tắt theo dõi servo) hữu ích để bắt đầu theo dõi tự động nếu không khởi động lại thiết bị. Đây là đầu vào sử dụng: D 0
  • G (Nhận giá trị cấu hình) đọc các giá trị từ EEPROM và IN-MEMORY: Đây là đầu vào sử dụng: G (chỉ mục là các giá trị byte hợp lệ 0 - 13 và 15)
  • S (Đặt giá trị EEPROM) đặt các giá trị thành EEPROM khả dụng sau khi khởi động lại. Đây là đầu vào sử dụng: S (chỉ mục là các giá trị byte hợp lệ 0 - 13, giá trị là các giá trị byte hợp lệ và thay đổi theo từng thuộc tính)

Mã là điểm trung thực cho các chỉ mục nhưng phần sau được sử dụng để làm hướng dẫn cho các giá trị / nhận xét hợp lệ:

  • I2C ADDRESS 0 - địa chỉ phụ của bộ điều khiển, chủ cần địa chỉ này để giao tiếp với bộ điều khiển (mặc định 10)
  • TỐI THIỂU CHỨNG NHẬN TỐI THIỂU 1 - giới hạn dưới góc nghiêng của servo dọc (mặc định 10, phạm vi 0 - 180)
  • MAXIMUM VERTICAL ANGLE 2 - giới hạn trên của servo dọc góc (mặc định 170, phạm vi 0 - 180)
  • SENSITIVITY VERTICAL LDR 3 - Biên độ đọc LDR theo chiều dọc (mặc định 20, phạm vi 0 - 1024)
  • VERTICAL ANGLE BƯỚC 4 - các bước servo dọc theo góc trên mỗi điều chỉnh (mặc định 5, phạm vi 1 - 20)
  • NGANG NGANG TỐI THIỂU 5 - giới hạn dưới góc nghiêng của servo ngang (mặc định 10, phạm vi 0 - 180)
  • TỐI ĐA NGANG ANGLE 6 - giới hạn trên của servo ngang góc (mặc định 170, phạm vi 0 - 180)
  • SENSITIVITY HORIZONTAL LDR 7 - Lề đọc LDR ngang (mặc định 20, phạm vi 0 - 1024)
  • NGANG ANGLE BƯỚC 8 - bước servo ngang góc trên mỗi điều chỉnh (mặc định 5, phạm vi 1 - 20)
  • SLEEP MINUTES 9 - khoảng thời gian ngủ gần đúng giữa các lần theo dõi (mặc định 20, phạm vi 1 - 255)
  • VERTICAL DAWN ANGLE 10 - SỬ DỤNG TRONG TƯƠNG LAI - góc thẳng đứng để quay lại khi mặt trời lặn
  • MẶT BẰNG NGÀY NGANG CÂU 11 - SỬ DỤNG TRONG TƯƠNG LAI - góc nằm ngang để quay lại khi mặt trời lặn
  • DAWN INTENSITY 12 - SỬ DỤNG TRONG TƯƠNG LAI - mức trung bình tối thiểu của tất cả các LDRs kích hoạt bắt đầu theo dõi ánh nắng mặt trời hàng ngày
  • DUSK INTENSITY 13 - SỬ DỤNG TRONG TƯƠNG LAI - mức trung bình tối thiểu của tất cả các LDRs kích hoạt kết thúc theo dõi ánh nắng hàng ngày
  • EEPROM VALUES MARKER 14 KẾT THÚC - GIÁ TRỊ KHÔNG ĐƯỢC SỬ DỤNG
  • CURRENT INTENSITY 15 - tỷ lệ phần trăm trung bình hiện tại của cường độ ánh sáng
  • END OF IN-MEMORY VALUES MARKER 16 - GIÁ TRỊ KHÔNG ĐƯỢC SỬ DỤNG.

Chụp đầu vào nối tiếp (đầu vào bàn phím trong cửa sổ giao diện điều khiển) và chuyển tiếp nó tới I2C slave ở định dạng char, byte, byte

#bao gồm
# defineI2C_MSG_IN_SIZE2
# xác địnhI2C_MSG_OUT_SIZE3
# defineI2C_SLAVE_ADDRESS10
boolean _newData = false;
const byte _numChars = 32;
char _receiveChars [_numChars]; // một mảng để lưu trữ dữ liệu đã nhận
voidsetup () {
Serial.begin (9600);
Wire.begin (D2, D1);
chậm trễ (5000);
}
voidloop () {
recvWithEndMarker ();
parseSendCommands ();
}
voidrecvWithEndMarker () {
byte tĩnh ndx = 0;
char endMarker = '\ n';
char rc;
while (Serial.available ()> 0 && _newData == false) {
rc = Serial.read ();
if (rc! = endMarker) {
_receiveChars [ndx] = rc;
ndx ++;
if (ndx> = _numChars) {
ndx = _numChars - 1;
}
} khác {
_reiledChars [ndx] = '\ 0'; // kết thúc chuỗi
ndx = 0;
_newData = true;
}
}
}
voidparseSendCommands () {
if (_newData == true) {
constchar delim [2] = "";
mã thông báo char *;
mã thông báo = strtok (_receiveChars, delim);
char cmd = _receiveChars [0];
chỉ số byte = 0;
giá trị byte = 0;
int i = 0;
while (mã thông báo! = NULL) {
//Serial.println(token);
i ++;
chuyển đổi (i) {
trường hợp 1:
mã thông báo = strtok (NULL, delim);
index = atoi (mã thông báo);
nghỉ;
case2:
mã thông báo = strtok (NULL, delim);
if (mã thông báo! = NULL) {
value = atoi (mã thông báo);
}
nghỉ;
vỡ nợ:
mã thông báo = NULL;
}
}
sendCmd (cmd, chỉ mục, giá trị);
_newData = false;
}
}
voidsendCmd (char cmd, chỉ số byte, giá trị byte) {
Serial.println ("-----");
Serial.println ("Đang gửi lệnh:");
Serial.println ("\ t" + String (cmd) + "" + String (chỉ mục) + "" + String (giá trị));
Serial.println ("-----");
Wire.beginTransmission (I2C_SLAVE_ADDRESS); // truyền tới thiết bị
Wire.write (cmd); // gửi một ký tự
Wire.write (chỉ mục); // gửi một byte
Wire.write (giá trị); // gửi một byte
Wire.endTransmission ();
phản hồi byte = 0;
bool hadResponse = false;
if (cmd == 'G') {
Wire.requestFrom (I2C_SLAVE_ADDRESS, 1);
while (Wire.available ()) // slave có thể gửi ít hơn yêu cầu
{
hadResponse = true;
response = Wire.read ();
}
if (hadResponse == true) {
Serial.println ("Đang nhận phản hồi:");
Serial.println (phản hồi);
}khác{
Serial.println ("Không có phản hồi, hãy kiểm tra địa chỉ / kết nối");
}
}
}

xem rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino được lưu trữ bằng ❤ bởi GitHub

Bước 8: Các bước tiếp theo

Kiểm tra lại định kỳ để kiểm tra các thay đổi trong phần mềm / phần cứng.

Sửa đổi phần mềm / phần cứng theo yêu cầu của bạn.

Nhận xét về bất kỳ yêu cầu / tối ưu hóa nào.

Đề xuất: