Sera / Mbed 2 deprecated Nucleo_AIRo-4_1_converter

Dependencies:   mbed

Committer:
serararai
Date:
Fri Mar 05 08:38:30 2021 +0000
Revision:
1:3e0ad6a257c5
Parent:
0:22b26272c47e
test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
serararai 1:3e0ad6a257c5 1
kakogawa 0:22b26272c47e 2 // Nucleo_CAN_master for AIRo-4.1
serararai 1:3e0ad6a257c5 3
serararai 1:3e0ad6a257c5 4
serararai 1:3e0ad6a257c5 5
serararai 1:3e0ad6a257c5 6
serararai 1:3e0ad6a257c5 7
serararai 1:3e0ad6a257c5 8
serararai 1:3e0ad6a257c5 9
serararai 1:3e0ad6a257c5 10
serararai 1:3e0ad6a257c5 11
serararai 1:3e0ad6a257c5 12
serararai 1:3e0ad6a257c5 13
serararai 1:3e0ad6a257c5 14
serararai 1:3e0ad6a257c5 15
serararai 1:3e0ad6a257c5 16
kakogawa 0:22b26272c47e 17 // Created by Atsushi Kakogawa, 2020.03.20
kakogawa 0:22b26272c47e 18 // Modified by ****** ******, 2020.**.**
kakogawa 0:22b26272c47e 19 // Department of Robotics, Ritsumeikan University, Japan
kakogawa 0:22b26272c47e 20
kakogawa 0:22b26272c47e 21 #include "mbed.h"
kakogawa 0:22b26272c47e 22 #include "CAN.h"
kakogawa 0:22b26272c47e 23
kakogawa 0:22b26272c47e 24 DigitalOut led1(LED1);
kakogawa 0:22b26272c47e 25 DigitalOut led2(D8);
kakogawa 0:22b26272c47e 26 DigitalOut led3(D4);
kakogawa 0:22b26272c47e 27 Serial pc(USBTX, USBRX, 115200); // Serial PC
kakogawa 0:22b26272c47e 28
kakogawa 0:22b26272c47e 29 Ticker rx; // timer for data receiver
kakogawa 0:22b26272c47e 30
kakogawa 0:22b26272c47e 31 //cancom;
kakogawa 0:22b26272c47e 32 CAN can(PA_11, PA_12);
kakogawa 0:22b26272c47e 33
serararai 1:3e0ad6a257c5 34 // motor number
serararai 1:3e0ad6a257c5 35 int m_num = 16;
serararai 1:3e0ad6a257c5 36
kakogawa 0:22b26272c47e 37 // from a master computer
kakogawa 0:22b26272c47e 38 int i=0;
kakogawa 0:22b26272c47e 39 char buf[255];
kakogawa 0:22b26272c47e 40
kakogawa 0:22b26272c47e 41 // converter
kakogawa 0:22b26272c47e 42 int mode, dir;
kakogawa 0:22b26272c47e 43 char tx_data[8];
kakogawa 0:22b26272c47e 44
kakogawa 0:22b26272c47e 45 // Data-receiver
serararai 1:3e0ad6a257c5 46 int id = 0, j;
kakogawa 0:22b26272c47e 47 int flag = 0;
kakogawa 0:22b26272c47e 48
kakogawa 0:22b26272c47e 49 // CAN communication to slaves
kakogawa 0:22b26272c47e 50 void send(int id, int mode, int dir, char targ3, char targ2, char targ1) {
kakogawa 0:22b26272c47e 51 int target_ang = ((int)targ3-0x30)*100+((int)targ2-0x30)*10+(int)targ1-0x30; // Convert from String to Int
kakogawa 0:22b26272c47e 52 char tx_target_U = (target_ang >> 8) & 0xff; // Split the Int data to upper
kakogawa 0:22b26272c47e 53 char tx_target_L = target_ang & 0xff; // Split the Int data to lower
kakogawa 0:22b26272c47e 54 tx_data[0] = id; // ID
kakogawa 0:22b26272c47e 55 tx_data[1] = mode; // mode (0: control, 1: response)
kakogawa 0:22b26272c47e 56 tx_data[2] = dir; // dir (0: positive, 1: negative)
kakogawa 0:22b26272c47e 57 tx_data[3] = tx_target_U; // target value upper 8bit
kakogawa 0:22b26272c47e 58 tx_data[4] = tx_target_L; // target value lower 8bit
kakogawa 0:22b26272c47e 59 tx_data[5] = 0;
kakogawa 0:22b26272c47e 60 tx_data[6] = 0;
kakogawa 0:22b26272c47e 61 tx_data[7] = 0;
serararai 1:3e0ad6a257c5 62 can.write(CANMessage(1335, tx_data, 8));
kakogawa 0:22b26272c47e 63 //pc.printf("Sent(0x): %x %x %x %x %x %x %x %x\r\n", tx_data[0], tx_data[1], tx_data[2], tx_data[3], tx_data[4], tx_data[5], tx_data[6], tx_data[7]);
kakogawa 0:22b26272c47e 64 }
kakogawa 0:22b26272c47e 65
kakogawa 0:22b26272c47e 66 void receive() {
kakogawa 0:22b26272c47e 67 CANMessage msg;
kakogawa 0:22b26272c47e 68 // CAN read from slaves and send to a master computer
kakogawa 0:22b26272c47e 69 if(can.read(msg)) {
kakogawa 0:22b26272c47e 70 int rid = msg.data[0];
kakogawa 0:22b26272c47e 71 int data1 = (msg.data[2] << 8) + msg.data[3]; // current
kakogawa 0:22b26272c47e 72 int data2 = (msg.data[4] << 8) + msg.data[5]; // velocity
kakogawa 0:22b26272c47e 73 int data3 = (msg.data[6] << 8) + msg.data[7]; // angle
kakogawa 0:22b26272c47e 74 //pc.printf("%d,%.2f,%.2f,%.2f\r\n", id, data1, data2, data3);
serararai 1:3e0ad6a257c5 75 //pc.printf("%d,%d,%d,%d,%d\r\n", rid, data1, data2, data3, 999);
kakogawa 0:22b26272c47e 76 pc.printf("%d,%d,%d,%d\r\n", rid, data1, data2, data3);
serararai 1:3e0ad6a257c5 77 //wait (0.001);//追加分
kakogawa 0:22b26272c47e 78 }
kakogawa 0:22b26272c47e 79 }
kakogawa 0:22b26272c47e 80
kakogawa 0:22b26272c47e 81 // Data-receiver timer
kakogawa 0:22b26272c47e 82 void RXdata() {
kakogawa 0:22b26272c47e 83 if (flag == 1) {
serararai 1:3e0ad6a257c5 84 send(id,1,0,0,0,0); // Receive command
serararai 1:3e0ad6a257c5 85 //wait (0.001);
serararai 1:3e0ad6a257c5 86 receive();
serararai 1:3e0ad6a257c5 87 //wait (0.001);
serararai 1:3e0ad6a257c5 88 if (id == m_num) {
serararai 1:3e0ad6a257c5 89 id = 1;
serararai 1:3e0ad6a257c5 90 } else {
serararai 1:3e0ad6a257c5 91 id++;
kakogawa 0:22b26272c47e 92 }
kakogawa 0:22b26272c47e 93 }
serararai 1:3e0ad6a257c5 94 //wait (0.001);//追加分
kakogawa 0:22b26272c47e 95 }
kakogawa 0:22b26272c47e 96
kakogawa 0:22b26272c47e 97 int main() {
serararai 1:3e0ad6a257c5 98 //pc.attach(NULL);//割り込み解除(試験的に導入,2021.2.7, oka)
kakogawa 0:22b26272c47e 99 //pc.printf("0,0\r\n");
kakogawa 0:22b26272c47e 100 can.frequency(1000000);
serararai 1:3e0ad6a257c5 101 rx.attach(&RXdata, 0.02); // 50 ms
kakogawa 0:22b26272c47e 102
kakogawa 0:22b26272c47e 103 while(1) {
serararai 1:3e0ad6a257c5 104 //receive();
kakogawa 0:22b26272c47e 105
kakogawa 0:22b26272c47e 106 // Serial read from a master computer
kakogawa 0:22b26272c47e 107 if (pc.getc()) {
kakogawa 0:22b26272c47e 108 for (i=1; i<256; i++) {
kakogawa 0:22b26272c47e 109 buf[i] = pc.getc();
kakogawa 0:22b26272c47e 110 if (buf[i] == '\n') {
kakogawa 0:22b26272c47e 111
kakogawa 0:22b26272c47e 112 // ***** Angle control mode *****
kakogawa 0:22b26272c47e 113 // send(ID, mode(0), dir(0 or 1), 3rd digit, 2rd digit, 1rd digit)
kakogawa 0:22b26272c47e 114 if (buf[i-5] == 'A'){
kakogawa 0:22b26272c47e 115 send(buf[i-4]-0x30,0,0,buf[i-3],buf[i-2],buf[i-1]);
kakogawa 0:22b26272c47e 116
kakogawa 0:22b26272c47e 117 // ***** Receive mode (single data) *****
kakogawa 0:22b26272c47e 118 // send(ID, mode(1), dir(0), NC, NC, NC)
kakogawa 0:22b26272c47e 119 } else if (buf[i-5] == 'B') {
kakogawa 0:22b26272c47e 120 send(buf[i-4]-0x30,1,0,0,0,0);
kakogawa 0:22b26272c47e 121 receive();
kakogawa 0:22b26272c47e 122
kakogawa 0:22b26272c47e 123 // ***** Speed control mode (positive) *****
kakogawa 0:22b26272c47e 124 // send(ID, mode(0), dir(0), 3rd digit, 2rd digit, 1rd digit)
kakogawa 0:22b26272c47e 125 } else if (buf[i-5] == 'C') {
kakogawa 0:22b26272c47e 126 send(buf[i-4]-0x30,0,0,buf[i-3],buf[i-2],buf[i-1]);
kakogawa 0:22b26272c47e 127
kakogawa 0:22b26272c47e 128 // ***** Speed control mode (negative) *****
kakogawa 0:22b26272c47e 129 // send(ID, mode(0), dir(1), 3rd digit, 2rd digit, 1rd digit)
kakogawa 0:22b26272c47e 130 } else if (buf[i-5] == 'D') {
kakogawa 0:22b26272c47e 131 send(buf[i-4]-0x30,0,1,buf[i-3],buf[i-2],buf[i-1]);
kakogawa 0:22b26272c47e 132
kakogawa 0:22b26272c47e 133 // ***** Receive mode start (continuous data) *****
kakogawa 0:22b26272c47e 134 // send(ID, mode(1), dir(0), NC, NC, NC)
kakogawa 0:22b26272c47e 135 } else if (buf[i-5] == 'E') {
serararai 1:3e0ad6a257c5 136 //id = buf[i-4]-0x30;
serararai 1:3e0ad6a257c5 137 //m_num = ((int)buf[i-3]-0x30)*100+((int)buf[i-2]-0x30)*10+(int)buf[i-1]-0x30; // Convert from String to Int;
serararai 1:3e0ad6a257c5 138 id = ((int)buf[i-3]-0x30)*100+((int)buf[i-2]-0x30)*10+(int)buf[i-1]-0x30; // Convert from String to Int;
kakogawa 0:22b26272c47e 139 flag = 1;
kakogawa 0:22b26272c47e 140
kakogawa 0:22b26272c47e 141 // ***** Receive mode stop (continuous data) *****
kakogawa 0:22b26272c47e 142 // send(ID, mode(1), dir(0), NC, NC, NC)
kakogawa 0:22b26272c47e 143 } else if (buf[i-5] == 'F') {
kakogawa 0:22b26272c47e 144 id = 0;
serararai 1:3e0ad6a257c5 145 //m_num = 0;
kakogawa 0:22b26272c47e 146 flag = 0;
kakogawa 0:22b26272c47e 147 }
kakogawa 0:22b26272c47e 148 i = 1;
kakogawa 0:22b26272c47e 149 break;
kakogawa 0:22b26272c47e 150 }
kakogawa 0:22b26272c47e 151 }
kakogawa 0:22b26272c47e 152 led1=!led1;
kakogawa 0:22b26272c47e 153 led2=!led2;
serararai 1:3e0ad6a257c5 154
serararai 1:3e0ad6a257c5 155 //pc.attach(NULL);//割り込み解除(試験的に導入,2021.2.7, oka)
kakogawa 0:22b26272c47e 156
kakogawa 0:22b26272c47e 157 //wait (0.001); // Eriminate this "wait" when linux
kakogawa 0:22b26272c47e 158 }
kakogawa 0:22b26272c47e 159 // CAN error check
kakogawa 0:22b26272c47e 160 if(can.rderror()){
kakogawa 0:22b26272c47e 161 pc.printf("rx error,%d\r\n",can.rderror());
kakogawa 0:22b26272c47e 162 can.reset();
kakogawa 0:22b26272c47e 163 led3=1;
serararai 1:3e0ad6a257c5 164 //wait (0.1);
kakogawa 0:22b26272c47e 165 } else {
kakogawa 0:22b26272c47e 166 led3=0;
kakogawa 0:22b26272c47e 167 }
kakogawa 0:22b26272c47e 168 if(can.tderror()){
kakogawa 0:22b26272c47e 169 pc.printf("tx error,%d\r\n",can.tderror());
kakogawa 0:22b26272c47e 170 can.reset();
kakogawa 0:22b26272c47e 171 led3=1;
serararai 1:3e0ad6a257c5 172 //wait (0.1);
kakogawa 0:22b26272c47e 173 } else {
kakogawa 0:22b26272c47e 174 led3=0;
kakogawa 0:22b26272c47e 175 }
kakogawa 0:22b26272c47e 176 }
kakogawa 0:22b26272c47e 177 }