Easy Control Library for Cubic 0.01
Loading...
Searching...
No Matches
cubic_arduino.h
1#ifndef Cubic_h
2#define Cubic_h
3#include "Arduino.h"
4#include <SPI.h>
5#include "33BLE_digitalWriteFast.hpp"
6using namespace nano33BLE_digitalWriteFast;
7
8// 各種ENABLEをHIGHにすることによって動作開始
9constexpr int ENABLE = 7;
10constexpr int ENABLE_MD_A = 2; // A面のモータドライバのENABLE、スレーブからマスターへデータを送る時LOWにしないといけないピン
11constexpr int ENABLE_MD_B = 3; // B面のモータドライバのENABLE、スレーブからマスターへデータを送る時LOWにしないといけないピン
12
13// SPI通信に用いるピン
14namespace CubicPin {
15 constexpr int MISO = 12;
16 constexpr int MOSI = 11;
17 constexpr int SCK = 13; // シリアルクロック
18}
19constexpr int SS_MD_A = 15; // モータドライバのSS(スレーブセレクト)
20constexpr int SS_MD_B = 6;
21constexpr int SS_INC_ENC = 20; // インクリメントエンコーダのSS
22constexpr int SS_ABS_ENC = 1; // アブソリュートエンコーダのSS
23constexpr int SS_ADC_A = 21; // ADCのSS
24constexpr int SS_ADC_B = 10;
25//マザーボードのRP2040をマスターとして各モータードライバ基盤に配置できるスレーブのSS
26constexpr int SS_MD_SS_A0 = 16;
27constexpr int SS_MD_SS_A1 = 17;
28constexpr int SS_MD_SS_A2 = 18;
29constexpr int SS_MD_SS_A3 = 19;
30constexpr int SS_MD_SS_B0 = 4;
31constexpr int SS_MD_SS_B1 = 5;
32constexpr int SS_MD_SS_B2 = 8;
33constexpr int SS_MD_SS_B3 = 9;
34
35
36constexpr int SPI_FREQ = 4000000;
37constexpr int ADC_SPI_FREQ = 1000000;
38
39// モータ,エンコーダの数
40constexpr int DC_MOTOR_NUM = 8;
41constexpr int INC_ENC_NUM = 8;
42constexpr int ABS_ENC_NUM = 8;
43constexpr int SOL_SUB_NUM = 4; // ソレノイドとサブチャンネルDCモータの数
44
45// 送受信するデータ1つ辺りのバイト数
46constexpr int DC_MOTOR_BYTES = 2;
47constexpr int INC_ENC_BYTES = 4;
48constexpr int ABS_ENC_BYTES = 2;
49
50// SPI通信におけるDCモータのDutyの最大値
51constexpr int DUTY_SPI_MAX = 32766;
52
53// 電流センサの取り得る最大電流値
54constexpr float CURRENT_MAX = 30.0;
55// 電流センサの分解能(-2048 ~ 2048)
56constexpr float CURRENT_RES = 2048;
57
58// アブソリュートエンコーダの取り得る最大値
59constexpr float ABS_ENC_MAX = 16383;
60// RP2040でアブソリュートエンコーダが正しく読めなかったときに返す値
61constexpr int ABS_ENC_ERR_RP2040 = 0x7fff;
62// Arduinoでアブソリュートエンコーダが正しく読めなかったときに返す値
63constexpr int ABS_ENC_ERR = 0xffff;
64
65// インクリメントエンコーダのRP2040のリセットピン(LOW:reset HIGH:start)
66constexpr int INC_ENC_RESET = 0;
67
68// ソレノイドの出力を切り替える最小時間(ms)
69constexpr float SOL_TIME_MIN = 10.0;
70// micros()で測れる最大時間
71constexpr int MICROS_MAX = 0xffffffff;
72
73class DC_motor {
74 public:
79 static void begin(bool use_B = false);
80
87 static void put(uint8_t num, int16_t duty, uint16_t duty_max = 1000);
88
89 // 指定したモータのDutyを取得する関数
90 // 第1引数:モータ番号0~11
91 static int16_t get(uint8_t num);
92
93 // すべてのモータのDutyをSPI通信で送信する関数
94 static void send(void);
95
96 // すべてのモータのDutyの値をSerial.print()で表示する関数
97 // ソレノイドの状態を出力している場合はSOLと表示される
98 static void print(bool new_line = false);
99
100 // RP2040への送信データを格納する配列
101 // 前半12個の要素がA面のデータ、後半12個の要素がB面のデータ
102 // ソレノイドを使用する場合は各面のデータの後ろ4つの要素を使用する
103 static int16_t buf[(DC_MOTOR_NUM+SOL_SUB_NUM)*2];
104
105 private:
106 // B面のモータドライバを使うかどうか
107 static bool _use_B;
108};
109
110class Solenoid {
111 public:
116 static void begin(bool use_B = false);
117
118 // 指定したソレノイドの状態を格納する関数
119 // 第1引数:ソレノイド番号0~3,第2引数:状態
120 static void put(uint8_t num, bool state);
121
122 // 指定したソレノイドの状態を取得する関数
123 static int8_t get(uint8_t num);
124
125 // すべてのソレノイドの状態をSerial.print()で表示する関数
126 static void print(bool new_line = false);
127
128 private:
129 // 状態を変更した時刻を保存する配列
130 static unsigned long time_prev[SOL_SUB_NUM*2];
131
132 // B面のモータドライバを使うかどうか
133 static bool _use_B;
134};
135
137 public:
138 // 初期化する関数
139 static void begin(void);
140
141 // エンコーダの累積値を取得する関数
142 // 第1引数:エンコーダ番号
143 static int32_t get(uint8_t num);
144
145 // エンコーダの差分値を取得する関数
146 // 第1引数:エンコーダ番号
147 static int16_t get_diff(uint8_t num);
148
149 // すべてのエンコーダの累積値をSPI通信で受信する関数
150 static void receive(void);
151
152 // すべてのエンコーダの累積値を0にする関数
153 static void reset(void);
154
155 // すべてのエンコーダの累積値をSerial.print()で表示する関数
156 static void print(bool new_line = false);
157
158 // すべてのエンコーダの差分値をSerial.print()で表示する関数
159 static void print_diff(bool new_line = false);
160
161 private:
162 // RP2040からの受信データを格納する配列
163 static uint8_t buf[INC_ENC_NUM*INC_ENC_BYTES*2];
164
165 // 1つ前の値を格納する配列
166 static int32_t val_prev[INC_ENC_NUM];
167
168 // 今の値をval_prevに保存する関数
169 static void save_val(void);
170};
171
173 public:
174 // 初期化する関数
175 static void begin(void);
176
177 // エンコーダの値を取得する関数
178 // 第1引数:エンコーダ番号
179 static uint16_t get(uint8_t num);
180
181 // すべてのエンコーダの値をSPI通信で受信する関数
182 static void receive(void);
183
184 // すべてのエンコーダの値をSerial.print()で表示する関数
185 static void print(bool new_line = false);
186
187 private:
188 // RP2040からの受信データを格納する配列
189 static uint8_t buf[ABS_ENC_NUM*ABS_ENC_BYTES];
190
191 // RP2040からの受信データのパリティチェックをする関数
192 static bool parity_check(uint16_t);
193
194 // RP2040からの受信データのパリティビットを取り除く関数
195 static uint16_t remove_parity_bit(uint16_t);
196};
197
198class Adc {
199 public:
200 // 初期化する関数
201 static void begin(void);
202
203 // 電流値を取得する関数
204 static float get(uint8_t num);
205
206 // 電流値を受信する関数
207 static void receive(void);
208
209 // 各メインモータに対応した電流値を表示する関数
210 static void print(bool new_line = false);
211
212 private:
213 // 各メインモータに対応した電流値を格納する配列
214 static float buf[DC_MOTOR_NUM];
215
216 // 各メインモータに対応したチャンネル番号を格納する配列
217 static const uint8_t ch[DC_MOTOR_NUM];
218
219 // 各メインモータに対応した電流値のバイアス項
220 static float bias[DC_MOTOR_NUM];
221
222 // 各メインモータに対応した電流値の前の値
223 static float buf_prev[DC_MOTOR_NUM];
224};
225
226class Cubic{
227 public:
233 static void begin(bool use_B = false, float current_limit = 2.0);
234
235 // データの送受信をまとめて行う関数
236 static void update(unsigned int us = 4000);
237
238 private:
239 // 1つ前のループの時刻
240 static unsigned long time_prev;
241
242 // モータを止める電流の閾値
243 static float _current_limit;
244};
245
246#endif
Definition cubic_arduino.h:172
Definition cubic_arduino.h:198
Definition cubic_arduino.h:226
static void begin(bool use_B=false, float current_limit=2.0)
Definition cubic_arduino.cpp:376
Definition cubic_arduino.h:73
static void put(uint8_t num, int16_t duty, uint16_t duty_max=1000)
Definition cubic_arduino.cpp:57
static void begin(bool use_B=false)
Definition cubic_arduino.cpp:23
Definition cubic_arduino.h:136
Definition cubic_arduino.h:110
static void begin(bool use_B=false)
Definition cubic_arduino.cpp:133