Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: Main.cpp
- Revision:
- 0:4beb2ea291ec
- Child:
- 1:94c549ec20f9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Main.cpp Mon Mar 16 13:12:31 2020 +0000 @@ -0,0 +1,309 @@ +/* + * Main.cpp + * Copyright (c) 2017, ZHAW + * All rights reserved. + * + * Created on: 07.07.2017 + * Author: Marcel Honegger + */ + +#include <mbed.h> +#include <EthernetInterface.h> +//#include "SDFileSystem/SDFileSystem.h" +#include "HTTPServer.h" +#include "IndexScript.h" +#include "ControllerScript.h" +#include "EncoderCounter.h" +#include "IMU.h" +#include "IRSensor.h" +#include "SDBlockDevice.h" +#include "FATFileSystem.h" +#include "IRSensor.h" +#include "Controller.h" +#include "LIDAR.h" + +class Main { + + public: + + Main(); + void run(); + + private: + + Thread thread; +}; + +Main::Main() : thread(osPriorityNormal, 64*1024) { + + thread.start(callback(this, &Main::run)); +} + +void Main::run() { + + // create user_button object + DigitalIn user_button(USER_BUTTON); + DigitalOut led(LED1); + DigitalOut myLed2(LED2); + + DigitalOut enableRouter(PB_15); + enableRouter = 1; + + printf("Starting Router\r\n"); + Thread::wait(1000); + printf("Starting webserver\r\n"); + + // create webserver + EthernetInterface* ethernet = new EthernetInterface(); + ethernet->set_network("192.168.0.100", "255.255.255.0", "192.168.1.1"); + ethernet->connect(); + printf("The target IP address is '%s'\r\n", ethernet->get_ip_address()); + + HTTPServer httpServer(*ethernet); + + + + + // initialise PWM objects + PwmOut pwmRight(PF_8); + PwmOut pwmLeft(PF_7); + PwmOut pwmReserve(PF_9); + + // crete Encoder read objects + EncoderCounter counterRight(PB_4, PC_7); // counter(pin A, pin B) + EncoderCounter counterLeft(PA_15, PB_3); + EncoderCounter counterRes(PD_12, PD_13); + + PwmOut servo1(PE_10); + PwmOut servo2(PE_12); + + servo1.period(0.02f);// 0.02ms 50Hz + servo2.period(0.02f);// 0.02ms 50Hz + servo1.write(0.01f); + servo2.write(0.01f); + + Controller controller(pwmReserve, pwmRight, counterRes, counterRight); + + // create LIDAR object + PwmOut pwm(PE_9); + pwm.period(0.00005f); + pwm.write(0.5f); // 50% duty-cycle + + RawSerial com(PG_14, PG_9); + + LIDAR lidar(com); + + httpServer.add("index", new IndexScript()); + httpServer.add("controller", new ControllerScript(user_button,myLed2,controller,servo1,servo2,lidar)); + + // create IMU comunication objects + SPI spi(PC_12, PC_11, PC_10); // mosi, miso, sclk + DigitalOut csAG(PC_8); + DigitalOut csM(PC_9); + + //create IMU object + IMU imu(spi, csAG, csM); + printf("IMU init done\r\n"); + // create IRSensor object + AnalogIn distance(PA_0); + + // create multiplexer objects + DigitalOut bit0(PF_0); + DigitalOut bit1(PF_1); + DigitalOut bit2(PF_2); + + // create sd card object + SDBlockDevice sd(PE_6, PE_5, PE_2, PE_4); // mosi miso clk cs + FATFileSystem fs("sd"); + printf("SD FileSystem init done\r\n"); + + // others + DigitalOut enable_motors(PG_0); + DigitalIn driver_warning(PD_0); + DigitalIn driver_fault(PD_1); + + DigitalOut enable_IRsens(PG_1); + + CAN can(PB_12, PB_6); + + AnalogIn ain1(PB_1); + AnalogIn ain2(PC_2); + AnalogIn ain3(PF_4); + + DigitalIn din1(PE_14); + DigitalIn din2(PE_15); + DigitalIn din3(PE_0); + + I2C i2c(PB_11,PB_10); + + + + Serial uartGroove(PE_8, PE_7); // tx, rx + + DigitalOut led0(PD_4); + DigitalOut led1(PD_3); + DigitalOut led2(PD_6); + DigitalOut led3(PD_2); + DigitalOut led4(PD_7); + DigitalOut led5(PD_5); + + led0 = 0; + led1 = 0; + led2 = 0; + led3 = 0; + led4 = 0; + led5 = 0; + + enable_IRsens = 1; + + IRSensor irSensor0(distance, bit0, bit1, bit2, 0); + IRSensor irSensor1(distance, bit0, bit1, bit2, 1); + IRSensor irSensor2(distance, bit0, bit1, bit2, 2); + IRSensor irSensor3(distance, bit0, bit1, bit2, 3); + IRSensor irSensor4(distance, bit0, bit1, bit2, 4); + IRSensor irSensor5(distance, bit0, bit1, bit2, 5); + + // enter main loop + + enable_motors = 1; + pwmLeft.period(0.00005f);// 0.05ms 20KHz + pwmLeft.write(0.5f); + pwmRight.period(0.00005f);// 0.05ms 20KHz + pwmRight.write(0.5f); + pwmReserve.period(0.00005f);// 0.05ms 20KHz + pwmReserve.write(0.5f); + + + /* + sd.init(); + fs.mount(&sd); + mkdir("/sd/Measure", 0777); + printf("Folder created, SD initialisation done\r\n"); + FILE *fp = fopen("/sd/Measure/sdBlockDeviceTest.txt", "w"); + fprintf(fp, "accelerometer %.5f %.5f %.5f\r\n",imu.readAccelerationX(),imu.readAccelerationY(),imu.readAccelerationZ()); + fclose(fp); + // read from SD card + fp = fopen("/sd/Measure/sdBlockDeviceTest.txt", "r"); + if (fp != NULL) { + char c = fgetc(fp); + if (c == 'a') + printf("SD write/read success!\r\n"); + else + printf("incorrect char (%c)!\n", c); + fclose(fp); + } else { + printf("Reading failed!\n"); + }*/ + + //pwmLeft.write(0.99f); + + printf("\r\ninit done\r\n"); + + short previousValueCounterLeft = counterLeft.read(); + short previousValueCounterRight = counterRight.read(); + + while (true) { + + led = !led; + + //printf("ax = %.3f ay = %.3f az = %.3f\r\n",imu.readAccelerationX(),imu.readAccelerationY(),imu.readAccelerationZ()); + + //printf("counter right = %d counter left = %d counter res = %d\r\n",counterRight.read(),counterLeft.read(),counterRes.read()); + //printf("counter left = %.5f counter right = %.5f counter res = %.5f [uhmdreungen]\r\n",counterRight.read()/21504.0f,counterLeft.read()/21504.0f,counterRes.read()/21504.0f); + //printf("din1 = %d din2 = %d din3 = %d\r\n",din1.read(),din2.read(),din3.read()); + //printf("ain1 = %.3f ain2 = %.3f ain3 = %.3f\r\n",ain1.read()*3.3f,ain2.read()*3.3f,ain3.read()*3.3f); + //printf("%.3f | %.3f | %.3f\r\n %.3f | %.3f | %.3f\r\n\r\n",irSensor2.read(),irSensor0.read(),irSensor5.read(),irSensor3.read(),irSensor1.read(),irSensor4.read()); + //printf("angle right %.3f | angle left %.3f\r\n",controller.getangleRight(), controller.getangleLeft()); + + //printf("servo1 = %.3f servo2 = %.3f\r\n",servo1.read(),servo2.read()); + + printf("distance 0°=%d 90°=%d 180°=%d\r\n",lidar.getDistance(0),lidar.getDistance(90),lidar.getDistance(180)); + + if(user_button){ + //pwmLeft.write(0.5f); + //pwmRight.write(0.5f); + //pwmReserve.write(0.5f); + //servo1.write(0.09f); + //servo2.write(0.09f); + + //uartGroove.printf("ciao\r\n"); + //i2c.write(0x48, 0x00, 1); + //controller.setTranslationalVelocity(2.0f); + //controller.startMeasure(); + + } else { + //pwmLeft.write(0.99f); + //pwmRight.write(0.99f); + //pwmReserve.write(0.99f); + //servo1.write(0.1f); + //servo2.write(0.1f); + //controller.setTranslationalVelocity(0.0f); + } + + + + float DISTANCE_THRESHOLD = 0.2f; + + led0 = irSensor0 < DISTANCE_THRESHOLD; + led1 = irSensor1 < DISTANCE_THRESHOLD; + led2 = irSensor2 < DISTANCE_THRESHOLD; + led3 = irSensor3 < DISTANCE_THRESHOLD; + led4 = irSensor4 < DISTANCE_THRESHOLD; + led5 = irSensor5 < DISTANCE_THRESHOLD; + + + /* + led1 = 0; + led3 = 0; + led4 = 0; + led5 = 0; + led6 = 0;*/ + + + + /* + led1 = !led1; + led2 = !led2; + led3 = !led3; + led4 = !led4; + led5 = !led5; + led6 = !led6;*/ + + /* + + short valueCounterLeft = counterLeft.read(); + short valueCounterRight = counterRight.read(); + + short countsInPastPeriodLeft = valueCounterLeft-previousValueCounterLeft; + short countsInPastPeriodRight = valueCounterRight-previousValueCounterRight; + + previousValueCounterLeft = valueCounterLeft; + previousValueCounterRight = valueCounterRight; + + countsRight = countsRight + countsInPastPeriodRight; + countsLeft = countsLeft + countsInPastPeriodLeft; + + printf("counter right = %d counter left = %d\r\n",countsRight,countsLeft);*/ + + /* + FILE *fp = fopen("/sd/Measure/sdBlockDeviceTest.txt", "a"); + fprintf(fp, "accelerometer %.5f %.5f %.5f\r\n",imu.readAccelerationX(),imu.readAccelerationY(),imu.readAccelerationZ()); + fclose(fp);*/ + + + + Thread::wait(200); + } +} + +/** + * This main method is the entry point of the controller software. + * The code in this method is running within a thread of the rtos. + */ +int main() { + + Main main; + + Thread::wait(osWaitForever); +} +