Skip to content

Commit b4e7353

Browse files
authored
Merge pull request #24 from arduino-libraries/battery_behaviour
1.0.4 - Battery alert
2 parents a7a796f + 721dc82 commit b4e7353

File tree

5 files changed

+181
-132
lines changed

5 files changed

+181
-132
lines changed

examples/firmware/firmware.ino

Lines changed: 109 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -96,110 +96,113 @@ void loop(){
9696
}
9797
if (packeter.checkPayload()) {
9898
code = packeter.payloadTop();
99-
switch (code){
100-
case 'J':
101-
packeter.unpacketC2F(code,left,right);
102-
alvik.disableKinematicsMovement();
103-
alvik.disablePositionControl();
104-
alvik.setRpm(left, right);
105-
break;
106-
107-
case 'V':
108-
packeter.unpacketC2F(code,linear,angular);
109-
alvik.disableKinematicsMovement();
110-
alvik.disablePositionControl();
111-
alvik.drive(linear,angular);
112-
break;
113-
114-
case 'W':
115-
packeter.unpacketC2B1F(code,label,control_type,value);
116-
alvik.disableKinematicsMovement();
117-
if (label=='L'){
118-
switch (control_type){
119-
case 'V':
120-
alvik.disablePositionControlLeft();
121-
alvik.setRpmLeft(value);
122-
break;
123-
case 'P':
124-
alvik.setPositionLeft(value);
125-
ack_required=MOVEMENT_LEFT;
126-
ack_check=true;
127-
break;
128-
case 'Z':
129-
alvik.resetPositionLeft(value);
130-
break;
99+
if (!alvik.isBatteryAlert()){
100+
switch (code){
101+
case 'J':
102+
packeter.unpacketC2F(code,left,right);
103+
alvik.disableKinematicsMovement();
104+
alvik.disablePositionControl();
105+
alvik.setRpm(left, right);
106+
break;
107+
108+
case 'V':
109+
packeter.unpacketC2F(code,linear,angular);
110+
alvik.disableKinematicsMovement();
111+
alvik.disablePositionControl();
112+
alvik.drive(linear,angular);
113+
break;
114+
115+
case 'W':
116+
packeter.unpacketC2B1F(code,label,control_type,value);
117+
alvik.disableKinematicsMovement();
118+
if (label=='L'){
119+
switch (control_type){
120+
case 'V':
121+
alvik.disablePositionControlLeft();
122+
alvik.setRpmLeft(value);
123+
break;
124+
case 'P':
125+
alvik.setPositionLeft(value);
126+
ack_required=MOVEMENT_LEFT;
127+
ack_check=true;
128+
break;
129+
case 'Z':
130+
alvik.resetPositionLeft(value);
131+
break;
132+
}
131133
}
132-
}
133-
if (label=='R'){
134-
switch (control_type){
135-
case 'V':
136-
alvik.disablePositionControlRight();
137-
alvik.setRpmRight(value);
138-
break;
139-
case 'P':
140-
alvik.setPositionRight(value);
141-
ack_required=MOVEMENT_RIGHT;
142-
ack_check=true;
143-
break;
144-
case 'Z':
145-
alvik.resetPositionRight(value);
146-
break;
134+
if (label=='R'){
135+
switch (control_type){
136+
case 'V':
137+
alvik.disablePositionControlRight();
138+
alvik.setRpmRight(value);
139+
break;
140+
case 'P':
141+
alvik.setPositionRight(value);
142+
ack_required=MOVEMENT_RIGHT;
143+
ack_check=true;
144+
break;
145+
case 'Z':
146+
alvik.resetPositionRight(value);
147+
break;
148+
}
147149
}
148-
}
149-
break;
150-
151-
152-
case 'A':
153-
packeter.unpacketC2F(code,position_left, position_right);
154-
alvik.disableKinematicsMovement();
155-
alvik.setPosition(position_left, position_right);
156-
ack_required=MOVEMENT_POSITION;
157-
ack_check=true;
158-
break;
159-
160-
161-
case 'S':
162-
packeter.unpacketC2B(code,servo_A,servo_B);
163-
alvik.setServoA(servo_A);
164-
alvik.setServoB(servo_B);
165-
break;
166-
167-
case 'L':
168-
packeter.unpacketC1B(code,leds);
169-
alvik.setAllLeds(leds);
170-
break;
171-
172-
case 'P':
173-
packeter.unpacketC1B3F(code,pid,kp,ki,kd);
174-
if (pid=='L'){
175-
alvik.setKPidLeft(kp,ki,kd);
176-
}
177-
if (pid=='R'){
178-
alvik.setKPidRight(kp,ki,kd);
179-
}
180-
break;
181-
182-
case 'R':
183-
packeter.unpacketC1F(code, value);
184-
alvik.disablePositionControl();
185-
alvik.rotate(value);
186-
ack_required=MOVEMENT_ROTATE;
187-
ack_check=true;
188-
break;
189-
190-
case 'G':
191-
packeter.unpacketC1F(code, value);
192-
alvik.disablePositionControl();
193-
alvik.move(value);
194-
ack_required=MOVEMENT_MOVE;
195-
ack_check=true;
196-
break;
197-
198-
case 'Z':
199-
packeter.unpacketC3F(code, x, y, theta);
200-
alvik.resetPose(x, y, theta);
201-
break;
202-
150+
break;
151+
152+
153+
case 'A':
154+
packeter.unpacketC2F(code,position_left, position_right);
155+
alvik.disableKinematicsMovement();
156+
alvik.setPosition(position_left, position_right);
157+
ack_required=MOVEMENT_POSITION;
158+
ack_check=true;
159+
break;
160+
161+
162+
case 'S':
163+
packeter.unpacketC2B(code,servo_A,servo_B);
164+
alvik.setServoA(servo_A);
165+
alvik.setServoB(servo_B);
166+
break;
167+
168+
case 'L':
169+
packeter.unpacketC1B(code,leds);
170+
alvik.setAllLeds(leds);
171+
break;
172+
173+
case 'P':
174+
packeter.unpacketC1B3F(code,pid,kp,ki,kd);
175+
if (pid=='L'){
176+
alvik.setKPidLeft(kp,ki,kd);
177+
}
178+
if (pid=='R'){
179+
alvik.setKPidRight(kp,ki,kd);
180+
}
181+
break;
182+
183+
case 'R':
184+
packeter.unpacketC1F(code, value);
185+
alvik.disablePositionControl();
186+
alvik.rotate(value);
187+
ack_required=MOVEMENT_ROTATE;
188+
ack_check=true;
189+
break;
190+
191+
case 'G':
192+
packeter.unpacketC1F(code, value);
193+
alvik.disablePositionControl();
194+
alvik.move(value);
195+
ack_required=MOVEMENT_MOVE;
196+
ack_check=true;
197+
break;
198+
199+
case 'Z':
200+
packeter.unpacketC3F(code, x, y, theta);
201+
alvik.resetPose(x, y, theta);
202+
break;
203+
}
204+
}
205+
switch (code){
203206
case 'X':
204207
packeter.unpacketC1B(code, ack_code);
205208
if (ack_code == 'K') {
@@ -213,6 +216,9 @@ void loop(){
213216
case 1:
214217
alvik.setBehaviour(LIFT_ILLUMINATOR, true);
215218
break;
219+
case 2:
220+
alvik.setBehaviour(BATTERY_ALERT, true);
221+
break;
216222
default:
217223
alvik.setBehaviour(ALL_BEHAVIOURS, false);
218224
}
@@ -326,7 +332,7 @@ void loop(){
326332
if (millis()-tbattery>1000){
327333
tbattery = millis();
328334
alvik.updateBMS();
329-
msg_size = packeter.packetC1F('p', alvik.getBatteryChargePercentage());
335+
msg_size = packeter.packetC1F('p', alvik.isBatteryCharging()*alvik.getBatteryChargePercentage());
330336
alvik.serial->write(packeter.msg,msg_size);
331337
}
332338
}

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=Arduino_AlvikCarrier
2-
version=1.0.3
2+
version=1.0.4
33
author=Arduino, Giovanni di Dio Bruno, Lucio Rossi
44
maintainer=Arduino <[email protected]>
55
sentence=Library and firmware for Arduino Alvik Carrier board

src/Arduino_AlvikCarrier.cpp

Lines changed: 59 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -269,13 +269,20 @@ void Arduino_AlvikCarrier::disconnectExternalI2C(){
269269
/******************************************************************************************************/
270270

271271
int Arduino_AlvikCarrier::beginBMS(){
272+
charging = 0.0;
272273
while(digitalRead(NANO_CHK)==HIGH){}
273274
return bms->begin();
274275
}
275276

276277
void Arduino_AlvikCarrier::updateBMS(){
277278
voltage = bms->readVCell();
278279
state_of_charge = bms->readSoc();
280+
if (bms->isCharging()){
281+
charging = 1.0;
282+
}
283+
else{
284+
charging = -1.0;
285+
}
279286
}
280287

281288

@@ -287,6 +294,14 @@ float Arduino_AlvikCarrier::getBatteryChargePercentage(){
287294
return state_of_charge;
288295
}
289296

297+
float Arduino_AlvikCarrier::isBatteryCharging(){
298+
return charging;
299+
}
300+
301+
bool Arduino_AlvikCarrier::isBatteryAlert(){
302+
return battery_alert;
303+
}
304+
290305

291306

292307
/******************************************************************************************************/
@@ -969,43 +984,62 @@ void Arduino_AlvikCarrier::beginBehaviours(){
969984
prev_illuminator_state = illuminator_state;
970985
behaviours = 0;
971986
first_lift = true;
987+
battery_alert_time = millis();
988+
battery_alert_wave = 100;
989+
battery_alert = false;
972990
}
973991

974992

975993
void Arduino_AlvikCarrier::updateBehaviours(){
976-
if (behaviours|=1 == 1){
977-
/*
994+
995+
// illuminator off on lift
996+
if ((1<<(LIFT_ILLUMINATOR-1)) & behaviours){
997+
978998
if (isLifted()&&first_lift){
979-
first_lift = false;
980-
prev_illuminator_state = illuminator_state;
981-
disableIlluminator();
999+
//disableIlluminator();
1000+
setIlluminator(LOW);
1001+
first_lift=false;
9821002
}
983-
if (isLifted()&&!first_lift) {
984-
if (prev_illuminator_state!=0){
985-
disableIlluminator();
1003+
else{
1004+
if (!isLifted()){
1005+
setIlluminator(prev_illuminator_state);
9861006
}
987-
}
988-
if (!isLifted()&&!first_lift){
989-
if (prev_illuminator_state!=0){
990-
//first_lift = true;
991-
enableIlluminator();
1007+
if (!isLifted()&&!first_lift){
1008+
first_lift = true;
9921009
}
9931010
}
994-
*/
995-
if (isLifted()&&first_lift){
996-
//disableIlluminator();
997-
setIlluminator(LOW);
998-
first_lift=false;
999-
}
1000-
else{
1001-
if (!isLifted()){
1002-
setIlluminator(prev_illuminator_state);
1011+
}
1012+
1013+
// battery alert
1014+
if ((1<<(BATTERY_ALERT-1)) & behaviours){
1015+
if ((isBatteryCharging()==-1)&&(getBatteryChargePercentage()<BATTERY_ALERT_MINIMUM_CHARGE)){
1016+
if (millis()-battery_alert_time>battery_alert_wave){
1017+
battery_alert_time = millis();
1018+
if (battery_alert_wave==400){
1019+
setLeds(COLOR_RED);
1020+
setLedBuiltin(HIGH);
1021+
battery_alert_wave=100;
1022+
}
1023+
else{
1024+
setLeds(COLOR_BLACK);
1025+
setLedBuiltin(LOW);
1026+
battery_alert_wave=400;
1027+
}
1028+
}
1029+
if (getBatteryChargePercentage()<BATTERY_ALERT_STOP_CHARGE){
1030+
battery_alert = true;
1031+
setRpm(0,0);
1032+
setIlluminator(false);
1033+
}
10031034
}
1004-
if (!isLifted()&&!first_lift){
1005-
first_lift = true;
1035+
else{
1036+
battery_alert = false;
10061037
}
1007-
}
10081038
}
1039+
else{
1040+
battery_alert = false;
1041+
}
1042+
10091043
}
10101044

10111045
void Arduino_AlvikCarrier::setBehaviour(const uint8_t behaviour, const bool enable){

0 commit comments

Comments
 (0)