So here are all 3 prongs of the plane code thus far. This sends data to the visual basic program, then to the visual basic program where it gets interpreted and then sent to the plane simulator Arduino. Where it is written to servos and and led.
Arduino Controller:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
//Mux control pins</pre> int s0 = 8; int s1 = 9; int s2 = 10; int s3 = 11; int SIG_pin = 0; //Shift Register Pins int SER_Pin = 5; //pin 14 on the 75HC595 int RCLK_Pin = 6; //pin 12 on the 75HC595 int SRCLK_Pin = 7; //pin 11 on the 75HC595 #define number_of_74hc595s 1 //How many of the shift registers - change this #define numOfRegisterPins number_of_74hc595s * 8 //do not touch boolean registers[numOfRegisterPins]; //other pin setup int joystick_x; int joystick_y; int pot_1; int debug_switch = 4; void setup(){ //mux setup pinMode(s0, OUTPUT); pinMode(s1, OUTPUT); pinMode(s2, OUTPUT); pinMode(s3, OUTPUT); digitalWrite(s0, LOW); digitalWrite(s1, LOW); digitalWrite(s2, LOW); digitalWrite(s3, LOW); //shift register setup pinMode(SER_Pin, OUTPUT); pinMode(RCLK_Pin, OUTPUT); pinMode(SRCLK_Pin, OUTPUT); pinMode(0, INPUT); clearRegisters(); writeRegisters(); //other pin setup pinMode(debug_switch, INPUT); Serial.begin(9600); } void loop(){ //start of main loop ------------------------------------------- delay(25); pin_remap(); if (digitalRead(debug_switch) == HIGH){ serial_output_debug(); setRegisterPin(1, HIGH); setRegisterPin(2, LOW); writeRegisters(); } if (digitalRead(debug_switch) == LOW){ serial_output(); setRegisterPin(2, HIGH); setRegisterPin(1, LOW); writeRegisters(); } } //end of main loop -------------------------------------------------------- //start of logic functions ------------------------------------------------ void serial_output(){ Serial.print(joystick_x); Serial.print(" "); Serial.print(joystick_y); Serial.print(" "); Serial.print(pot_1); Serial.println(""); } void serial_output_debug(){ Serial.print("Joystick X Axis: "); Serial.print(joystick_x); Serial.print(" , "); Serial.print("Joystick Y Axis: "); Serial.print(joystick_y); Serial.print(" , "); Serial.print("Speed Potentiometer: "); Serial.print(pot_1); Serial.println(""); } void pin_remap(){ joystick_x = map(readMux(15), 0, 1023, 180, 0); joystick_y = map(readMux(14), 0, 1023, 0, 180); pot_1 = map(readMux(13), 0, 1023, 0, 255); } //end of logic functions -------------------------------------------------- void clearRegisters(){ for(int i = numOfRegisterPins - 1; i >= 0; i--){ registers[i] = LOW; } } void writeRegisters(){ digitalWrite(RCLK_Pin, LOW); for(int i = numOfRegisterPins - 1; i >= 0; i--){ digitalWrite(SRCLK_Pin, LOW); int val = registers[i]; digitalWrite(SER_Pin, val); digitalWrite(SRCLK_Pin, HIGH); } digitalWrite(RCLK_Pin, HIGH); } //set an individual pin HIGH or LOW void setRegisterPin(int index, int value){ registers[index] = value; } int readMux(int channel){ int controlPin[] = {s0, s1, s2, s3}; int muxChannel[16][4]={ {0,0,0,0}, //channel 0 {1,0,0,0}, //channel 1 {0,1,0,0}, //channel 2 {1,1,0,0}, //channel 3 {0,0,1,0}, //channel 4 {1,0,1,0}, //channel 5 {0,1,1,0}, //channel 6 {1,1,1,0}, //channel 7 {0,0,0,1}, //channel 8 {1,0,0,1}, //channel 9 {0,1,0,1}, //channel 10 {1,1,0,1}, //channel 11 {0,0,1,1}, //channel 12 {1,0,1,1}, //channel 13 {0,1,1,1}, //channel 14 {1,1,1,1} //channel 15 }; //loop through the 4 sig for(int i = 0; i < 4; i ++){ digitalWrite(controlPin[i], muxChannel[channel][i]); } //read the value at the SIG pin int val = analogRead(SIG_pin); //return the value return val; } <pre> |
Arduino Vehicle:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
</pre> const char EOPmarker = '.'; //This is the end of packet marker char serialbuf[32]; //This gives the incoming serial some room. Change it if you want a longer incoming. #include <string.h> // we'll need this for subString #define MAX_STRING_LEN 20 // like 3 lines above, change as needed. #include <LiquidCrystal.h> //we'll need this for the lcd LiquidCrystal lcd(7, 8, 9, 10, 11, 12); //pins for the lcd, I set it up using the ladyada tutorial. #include <Servo.h> Servo left_servo; Servo right_servo; int esc_pwm = 6; int left_servo_pos; int right_servo_pos; void setup(){ lcd.begin(16, 2); left_servo.attach(3); right_servo.attach(5); pinMode(esc_pwm, OUTPUT); Serial.begin(9600); //changing this to other speeds has not been tested using this meathod } void loop() { if (Serial.available() > 0) { //makes sure something is ready to be read lcd.clear(); //clears for incoming stuff, won't clear if there isin't data to be read static int bufpos = 0; //starts the buffer back at the first position in the incoming serial.read char inchar = Serial.read(); //assigns one byte (as serial.read()'s only input one byte at a time if (inchar != EOPmarker) { //if the incoming character is not the byte that is the incoming package ender serialbuf[bufpos] = inchar; //the buffer position in the array get assigned to the current read bufpos++; //once that has happend the buffer advances, doing this over and over again until the end of package marker is read. } else { //once the end of package marker has been read serialbuf[bufpos] = 0; //restart the buff bufpos = 0; //restart the position of the buff left_servo_pos = atoi(subStr(serialbuf, ",", 1)); lcd.write("Lft Servo:"); lcd.write(subStr(serialbuf, ",", 1)); //witres the first bit of content before the first comma (or other seperator) to the lcd left_servo.write(left_servo_pos); lcd.setCursor(0, 1); right_servo_pos = atoi(subStr(serialbuf, ",", 2)); lcd.write("Rgt Servo:"); //this signifies that the first seperation has occured lcd.write(subStr(serialbuf, ",", 2)); //same thing as 2 lines above, but with the second parts. this can be repeated right_servo.write(right_servo_pos); analogWrite(esc_pwm, atoi(subStr(serialbuf, ",", 3))); } } } // below is just function logic, which I do not fully understand. but it works. char* subStr (char* input_string, char *separator, int segment_number) { char *act, *sub, *ptr; static char copy[MAX_STRING_LEN]; int i; strcpy(copy, input_string); for (i = 1, act = copy; i <= segment_number; i++, act = NULL) { sub = strtok_r(act, separator, &ptr); if (sub == NULL) break; } return sub; } //esologic.com //Thanks to http://arduino.cc/forum/index.php?topic=119429 &nbsp; <pre> |
Visual Basic:
https://esologic.com/source/plane/Round_1/vehicle_companion/
Just download those files and you should be able to open them in the vb studio.
Thanks for your post. I also believe that laptop computers have gotten more and more popular lately, and now tend to be the only kind of computer utilised in a household. Simply because at the same time potentially they are becoming more and more very affordable, their working power is growing to the point where they may be as effective as pc’s coming from just a few years ago.
Great post. I was checking constantly this blog and I am impressed! Very helpful info specially the last part 🙂 I care for such info much. I was looking for this particular info for a very long time. Thank you and best of luck.