Подключение приборной панели к ПК
- Войдите на сайт для отправки комментариев
Чт, 30/10/2014 - 20:17
Доброго времени.
Ищу помощи, идей, проектов...как получиться.
В программировании слаб, только встал на этот путь. Электроная часть без проблемм.
Сообственно сама замарочка: есть игра Euro Truck Simulator2; есть плагин для игры, который выдаёт телеметрию машины на USB; есть скетч простенький (не мой), в котором спидометр и тахометр представлены как серво (т.е. прописка идёт градусов).
Вообщем правка скетча под лампочки сигнальные, проблемм особых не вызвало. Но вот со спидометром проблемма.
Вот сообственно в этой части и нужна помощь: как поправить скетч, так чтобы из "ШИМ-градусов" сделать "ШИМ-простой".
как поправить скетч
ну, открываешь скетч редактором и правишь... редактором скетчи правятся как-то.
как поправить скетч
ну, открываешь скетч редактором и правишь... редактором скетчи правятся как-то.
вот спасибо. хоть не написал, что на клавиатуре буковки нажимать надо.
вот скетч, над которым шаманю:
/* Copyright (c) 2013, Silas Parker All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. The name of Silas Parker may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <LiquidCrystal.h> #include <Servo.h> const int SPEEDO_PIN = A1; const int RPM_PIN = A0; const int LEFT_INDICATOR = 2; const int RIGHT_INDICATOR = 0; const int high_beam = 5; const int low_beam = 1; const int PARKING_BREAK = 7; const int battery_warning = 3; const int brake_air_warning = 4; const int brake_air_emergency = 8; const int electric_enabled = 11; const int engine_enabled = 10; // Servo variables Servo speedo; Servo rpm; #define PACKET_SYNC 0xFF #define PACKET_VER 2 #define SERVO_DIR_INVERT false #define SERVO_DIR_NORMAL true int serial_byte; LiquidCrystal lcd( 28, 25, 21, 22, 27, 29); void setup() { Serial.begin(115200); lcd.begin(16, 2); lcd.print("Self Test"); // Initialise servos speedo.attach(SPEEDO_PIN); speedo.write(180); rpm.attach(RPM_PIN); rpm.write(180); // Initialise LEDs pinMode(LEFT_INDICATOR, OUTPUT); pinMode(RIGHT_INDICATOR, OUTPUT); pinMode(electric_enabled, OUTPUT); pinMode(PARKING_BREAK, OUTPUT); pinMode(battery_warning, OUTPUT); pinMode(engine_enabled, OUTPUT); pinMode(low_beam, OUTPUT); pinMode(high_beam, OUTPUT); pinMode(brake_air_warning, OUTPUT); pinMode(brake_air_emergency, OUTPUT); digitalWrite(LEFT_INDICATOR, 0); digitalWrite(RIGHT_INDICATOR, 0); digitalWrite(electric_enabled, 0); digitalWrite(PARKING_BREAK, 0); digitalWrite(battery_warning, 0); digitalWrite(engine_enabled, 0); digitalWrite(low_beam, 0); digitalWrite(high_beam, 0); digitalWrite(brake_air_warning, 0); digitalWrite(brake_air_emergency, 0); delay(500); speedo.write(0); rpm.write(0); digitalWrite(LEFT_INDICATOR, 1); digitalWrite(RIGHT_INDICATOR, 1); digitalWrite(electric_enabled, 1); digitalWrite(PARKING_BREAK, 1); digitalWrite(battery_warning, 1); digitalWrite(engine_enabled, 1); digitalWrite(low_beam, 1); digitalWrite(high_beam, 1); digitalWrite(brake_air_warning, 1); digitalWrite(brake_air_emergency, 1); delay(500); speedo.write(180); rpm.write(180); digitalWrite(LEFT_INDICATOR, 0); digitalWrite(RIGHT_INDICATOR, 0); digitalWrite(electric_enabled, 0); digitalWrite(PARKING_BREAK, 0); digitalWrite(battery_warning, 0); digitalWrite(engine_enabled, 0); digitalWrite(low_beam, 0); digitalWrite(high_beam, 0); digitalWrite(brake_air_warning, 0); digitalWrite(brake_air_emergency, 0); lcd.clear(); lcd.print("Wait"); // Wait a second to ensure serial data isn't from re-programming delay(1000); lcd.clear(); lcd.print("Ready"); } void read_serial_byte_set_servo(Servo& servo, bool invert) { serial_byte = Serial.read(); serial_byte = (serial_byte < 0) ? 0 : ((serial_byte > 180) ? 180 : serial_byte); if (invert) servo.write(180 - serial_byte); else servo.write(serial_byte); } void skip_serial_byte() { (void)Serial.read(); } void digitalWriteFromBit(int port, int value, int shift) { digitalWrite(port, (value >> shift) & 0x01); } void loop() { if (Serial.available() < 16) return; serial_byte = Serial.read(); if (serial_byte != PACKET_SYNC) return; serial_byte = Serial.read(); if (serial_byte != PACKET_VER) { lcd.clear(); lcd.print("PROTOCOL VERSION ERROR"); return; } read_serial_byte_set_servo(speedo, SERVO_DIR_INVERT); // Speed read_serial_byte_set_servo(rpm, SERVO_DIR_NORMAL); // RPM skip_serial_byte(); // Brake air pressure skip_serial_byte(); // Brake temperature skip_serial_byte(); // Fuel ratio skip_serial_byte(); // Oil pressure skip_serial_byte(); // Oil temperature skip_serial_byte(); // Water temperature skip_serial_byte(); // Battery voltage // Truck lights byte serial_byte = Serial.read(); digitalWriteFromBit(LEFT_INDICATOR, serial_byte, 5); digitalWriteFromBit(RIGHT_INDICATOR, serial_byte, 4); digitalWriteFromBit(low_beam, serial_byte, 3); digitalWriteFromBit(high_beam, serial_byte, 2); // Warning lights bytes serial_byte = Serial.read(); digitalWriteFromBit(PARKING_BREAK, serial_byte, 7); digitalWriteFromBit(brake_air_warning, serial_byte, 5); digitalWriteFromBit(brake_air_emergency, serial_byte, 4); digitalWriteFromBit(battery_warning, serial_byte, 2); // Enabled flags serial_byte = Serial.read(); digitalWriteFromBit(electric_enabled, serial_byte, 1); digitalWriteFromBit(engine_enabled, serial_byte, 0); // Text length int text_len = Serial.read(); // Followed by text if (0 < text_len && text_len < 127) { lcd.clear(); for (int i = 0; i < text_len; ++i) { while (Serial.available() == 0) // Wait for data if slow { delay(2); } serial_byte = Serial.read(); if (serial_byte < 0 && serial_byte > 127) return; if (serial_byte == '\n') lcd.setCursor(0, 1); else lcd.print(char(serial_byte)); // delay(2); } } }я правильно понимаю, требуеться изменять строки 142...и т.д.?
добавить пин для шим
смотри строки 142-150. эту функцию нужно скопировать и сделать со своим названием. убрать оттуда в управление сервой, добавить map 0-180 в 0-255. и это выдать на пин шима через analogWrite
новую функцию вставить в 179 строке вместо read_serial_byte_set_servo
jeka_tm
что-то у меня ничего не получается:долго не получалось скомпелировать скетч, когда же удалось- реакции никакой.
Можешь дать почту? показать свои наработки
да кидай сюда или там что то секретное?
я на этот сайт попадаю через раз почему-то... уже перепробовал все браузеры, толку ноль.
попробую вставить код
#include <LiquidCrystal.h> #include <Servo.h> const int SPEEDO_PIN = A1; const int RPM_PIN = A0; const int LEFT_INDICATOR = 2; const int RIGHT_INDICATOR = 0; const int high_beam = 1; const int low_beam = 5; const int PARKING_BREAK = 7; const int battery_warning = 3; const int brake_air_warning = 4; const int brake_air_emergency = 8; const int electric_enabled = 9; const int engine_enabled = 11; const int PRM = 10; // LED int outputValue = 0; // Servo variables Servo speedo; Servo rpm; #define PACKET_SYNC 0xFF #define PACKET_VER 2 #define SERVO_DIR_INVERT false #define SERVO_DIR_NORMAL true int serial_byte; LiquidCrystal lcd( 28, 25, 21, 22, 27, 29); void setup() { Serial.begin(115200); lcd.begin(16, 2); lcd.print("Self Test"); // Initialise servos speedo.attach(SPEEDO_PIN); speedo.write(180); rpm.attach(RPM_PIN); rpm.write(180); // Initialise LEDs pinMode(LEFT_INDICATOR, OUTPUT); pinMode(RIGHT_INDICATOR, OUTPUT); pinMode(electric_enabled, OUTPUT); pinMode(PARKING_BREAK, OUTPUT); pinMode(battery_warning, OUTPUT); pinMode(engine_enabled, OUTPUT); pinMode(low_beam, OUTPUT); pinMode(high_beam, OUTPUT); pinMode(brake_air_warning, OUTPUT); pinMode(brake_air_emergency, OUTPUT); digitalWrite(LEFT_INDICATOR, 0); digitalWrite(RIGHT_INDICATOR, 0); digitalWrite(electric_enabled, 0); digitalWrite(PARKING_BREAK, 0); digitalWrite(battery_warning, 0); digitalWrite(engine_enabled, 0); digitalWrite(low_beam, 0); digitalWrite(high_beam, 0); digitalWrite(brake_air_warning, 0); digitalWrite(brake_air_emergency, 0); delay(500); speedo.write(0); rpm.write(0); digitalWrite(LEFT_INDICATOR, 1); digitalWrite(RIGHT_INDICATOR, 1); digitalWrite(electric_enabled, 1); digitalWrite(PARKING_BREAK, 1); digitalWrite(battery_warning, 1); digitalWrite(engine_enabled, 1); digitalWrite(low_beam, 1); digitalWrite(high_beam, 1); digitalWrite(brake_air_warning, 1); digitalWrite(brake_air_emergency, 1); delay(500); speedo.write(180); rpm.write(180); digitalWrite(LEFT_INDICATOR, 0); digitalWrite(RIGHT_INDICATOR, 0); digitalWrite(electric_enabled, 0); digitalWrite(PARKING_BREAK, 0); digitalWrite(battery_warning, 0); digitalWrite(engine_enabled, 0); digitalWrite(low_beam, 0); digitalWrite(high_beam, 0); digitalWrite(brake_air_warning, 0); digitalWrite(brake_air_emergency, 0); lcd.clear(); lcd.print("Wait"); // Wait a second to ensure serial data isn't from re-programming delay(1000); lcd.clear(); lcd.print("Ready"); } void read_serial_byte_set_servo(Servo& servo, bool invert) { serial_byte = Serial.read(); serial_byte = (serial_byte < 0) ? 0 : ((serial_byte > 180) ? 180 : serial_byte); if (invert) servo.write(180 - serial_byte); else servo.write(serial_byte); } void read_serial_byte_set_pwm(Servo& servo, bool invert) { serial_byte = Serial.read(); outputValue = map(serial_byte, 0, 180, 0, 255); analogWrite(PRM, outputValue); } void skip_serial_byte() { (void)Serial.read(); } void digitalWriteFromBit(int port, int value, int shift) { digitalWrite(port, (value >> shift) & 0x01); } void loop() { if (Serial.available() < 16) return; serial_byte = Serial.read(); if (serial_byte != PACKET_SYNC) return; serial_byte = Serial.read(); if (serial_byte != PACKET_VER) { lcd.clear(); lcd.print("PROTOCOL VERSION ERROR"); return; } read_serial_byte_set_servo(speedo, SERVO_DIR_INVERT); // Speed read_serial_byte_set_servo(rpm, SERVO_DIR_NORMAL); // RPM read_serial_byte_set_pwm(rpm, SERVO_DIR_INVERT); // Speed skip_serial_byte(); // Brake air pressure skip_serial_byte(); // Brake temperature skip_serial_byte(); // Fuel ratio skip_serial_byte(); // Oil pressure skip_serial_byte(); // Oil temperature skip_serial_byte(); // Water temperature skip_serial_byte(); // Battery voltage // Truck lights byte serial_byte = Serial.read(); digitalWriteFromBit(LEFT_INDICATOR, serial_byte, 5); digitalWriteFromBit(RIGHT_INDICATOR, serial_byte, 4); digitalWriteFromBit(low_beam, serial_byte, 3); digitalWriteFromBit(high_beam, serial_byte, 2); // Warning lights bytes serial_byte = Serial.read(); digitalWriteFromBit(PARKING_BREAK, serial_byte, 7); digitalWriteFromBit(brake_air_warning, serial_byte, 5); digitalWriteFromBit(brake_air_emergency, serial_byte, 4); digitalWriteFromBit(battery_warning, serial_byte, 2); // Enabled flags serial_byte = Serial.read(); digitalWriteFromBit(electric_enabled, serial_byte, 1); digitalWriteFromBit(engine_enabled, serial_byte, 0); // Text length int text_len = Serial.read(); // Followed by text if (0 < text_len && text_len < 127) { lcd.clear(); for (int i = 0; i < text_len; ++i) { while (Serial.available() == 0) // Wait for data if slow { delay(2); } serial_byte = Serial.read(); if (serial_byte < 0 && serial_byte > 127) return; if (serial_byte == '\n') lcd.setCursor(0, 1); else lcd.print(char(serial_byte)); // delay(2); } } }jeka_tm
минута есть взглянуть на моё творчество?
не получаются строки 130-133?
jeka_tm
я сдаюсь в чём моя ошибка?
скажи сначала что не работает
скетч компилируется и загружается в ардуино. но на прописаном выводе (т.е. 10) нет никаких сигналов.
да ты почитай что написал))) пины
PRM
RPM_pin
rmp
нафига столько?
да и логика программы не прослеживается. ты похоже тупо пины перепутал так как назвал их почти одинаково
нафига тебе шим на выходе если ты сервой управляешь. или что там у тебя за привод стоит?