Подключение приборной панели к ПК

Мишаня
Offline
Зарегистрирован: 12.10.2014

Доброго времени.

Ищу помощи, идей, проектов...как получиться.

В программировании слаб, только встал на этот путь. Электроная часть без проблемм.

Сообственно сама замарочка: есть игра Euro Truck Simulator2; есть плагин для игры, который выдаёт телеметрию машины на USB; есть скетч простенький (не мой), в котором спидометр и тахометр представлены как серво (т.е. прописка идёт градусов).

Вообщем правка скетча под лампочки сигнальные, проблемм особых не вызвало. Но вот со спидометром проблемма. 

Вот сообственно в этой части и нужна помощь: как поправить скетч, так чтобы из "ШИМ-градусов" сделать "ШИМ-простой".

Kлапаyций 99.99
Offline
Зарегистрирован: 11.10.2014

Мишаня пишет:

как поправить скетч

ну, открываешь скетч редактором и правишь... редактором скетчи правятся как-то.

Мишаня
Offline
Зарегистрирован: 12.10.2014

Kлапаyций 99.99 пишет:

Мишаня пишет:

как поправить скетч

ну, открываешь скетч редактором и правишь... редактором скетчи правятся как-то.

 

вот спасибо. хоть не написал, что на клавиатуре буковки нажимать надо.

 

Мишаня
Offline
Зарегистрирован: 12.10.2014

вот скетч, над которым шаманю:





/*
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...и т.д.?

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

добавить пин для шим

смотри строки 142-150. эту функцию нужно скопировать и сделать со своим названием. убрать оттуда в управление сервой, добавить map 0-180 в 0-255. и это выдать на пин шима через analogWrite

новую функцию вставить в 179 строке вместо read_serial_byte_set_servo

 

Мишаня
Offline
Зарегистрирован: 12.10.2014

jeka_tm

что-то у меня ничего не получается:долго не получалось скомпелировать скетч, когда же удалось- реакции никакой.

Можешь дать почту? показать свои наработки

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да кидай сюда или там что то секретное?

Мишаня
Offline
Зарегистрирован: 12.10.2014

я на этот сайт попадаю через раз почему-то... уже перепробовал все браузеры, толку ноль.

попробую вставить код 

 

Мишаня
Offline
Зарегистрирован: 12.10.2014
#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);
    }
  }
  
}

 

Мишаня
Offline
Зарегистрирован: 12.10.2014

jeka_tm

минута есть взглянуть на моё творчество?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

не получаются строки 130-133?

Мишаня
Offline
Зарегистрирован: 12.10.2014

jeka_tm

я сдаюсь в чём моя ошибка?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

скажи сначала что не работает

Мишаня
Offline
Зарегистрирован: 12.10.2014

скетч компилируется и загружается в ардуино. но на прописаном выводе (т.е. 10) нет никаких сигналов.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да ты почитай что написал))) пины

PRM

RPM_pin

rmp

нафига столько?

да и логика программы не прослеживается. ты похоже тупо пины перепутал так как назвал их почти одинаково

нафига тебе шим на выходе если ты сервой управляешь. или что там у тебя за привод стоит?