PCCar.ru - Ваш автомобильный компьютер

Вернуться   PCCar.ru - Ваш автомобильный компьютер > MP3Car ТехИнфа > Общение с машиной

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2015, 05:13   #111
xmetal
Пользователь
 
Регистрация: 29.07.2015
Регион: 64
Машина: VW Tiguan
Сообщений: 89
xmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant future
По умолчанию

Цитата:
Сообщение от T_r_D Посмотреть сообщение
но поторопился!
Согласен, фигня получается.
xmetal вне форума   Ответить с цитированием
Старый 12.11.2015, 22:29   #112
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Короче, я в стопоре.
С программированием под андроид чо-то как-то совсем уныло. Ни фига понять не могу, да и время нету почти.
Заказал модуль приёмника Fm. Догружу своё устройство им до полного счастья.
T_r_D вне форума   Ответить с цитированием
Старый 15.11.2015, 12:01   #113
Raikkonen
Новый Пользователь
 
Регистрация: 08.11.2015
Регион: 66, 96
Сообщений: 11
Raikkonen is on a distinguished road
По умолчанию

терпение и труд!
Raikkonen вне форума   Ответить с цитированием
Старый 06.12.2015, 16:34   #114
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Вот тут я описал написание программы под Android.
Почти месяц мучений.
http://www.pccar.ru/showthread.php?t=23635
Она пока пустая, просто принимает данные и выводит их, но это не надолго
T_r_D вне форума   Ответить с цитированием
Старый 23.12.2015, 02:59   #115
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Итак, с USB коннектом и pro micro не сложилось.
Был докуплен модуль HC 05 bluetooth
И при помощи него реализован коннект.
Всё работает хорошо, но есть проблема в обнаружение подключения.

Ни чего путного в инете не нашёл, а пробовать каждый раз коннектится к устройству очень долго.

Тоесть получается:
Зажигание выключилось и переферия отключилась.
Планшет ушёл спать.
Зажигание включилось, переферия включилась, планшет проснулся, но поскольку программа не выключалась, то коннекта нет.
Нужно или как-то научить программу видеть уход в сон и возвращение из него или при помощи кондёров делать задержку отключения переферии чтоб она могла на последнем издыхании гавкнуть что питания нет и тем самым прогу вообще завершить.
Тогда вопрос как при выходе из сна её запустить?

Не знаю куда код программы для андройда выкидывать. Сюда или в программы.
T_r_D вне форума   Ответить с цитированием
Старый 23.12.2015, 21:30   #116
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Итак, допилил прогу под ВТ для андройда.
манифест
PHP код:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.oho.bt" >

    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar" >

            <receiver android:name=".MyReceiver"
                android:enabled="true"
                android:exported="false">
                <intent-filter>
                    <action android:name="android.intent.action.SCREEN_ON"/>
                    <action android:name="android.intent.action.SCREEN_OFF"/>
                </intent-filter>
            </receiver>

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
Ява
PHP код:
package com.example.oho.bt;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.os.Handler;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class 
MainActivity extends Activity {

    
Button btnOnbtnOff;
    
TextView txtArduino;

    
Handler h;
    private static final 
int REQUEST_ENABLE_BT 1;
    private 
BluetoothAdapter btAdapter null;
    private 
ConnectedThread mConnectedThread;
    private 
StringBuilder sb = new StringBuilder();
    final 
int RECIEVE_MESSAGE 1;        // Статус для Handler
    
Integer btconnectingst 0//Проверяем активно ли соединение

    
@Override
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        
setContentView(R.layout.activity_main);
        
btnOn = (ButtonfindViewById(R.id.btnOn);
        
btnOff = (ButtonfindViewById(R.id.btnOff);

        
txtArduino = (TextViewfindViewById(R.id.txtArduino);
        
btAdapter BluetoothAdapter.getDefaultAdapter();
        
registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_ON));
        
registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_OFF));

        
btnOn.setOnClickListener(new OnClickListener() {
            public 
void onClick(View v) {
                if (
btconnectingst.equals(1)) {
                    
mConnectedThread.write("1"); // Отправляем через Bluetooth цифру 1
                
}
            }
        });

        
btnOff.setOnClickListener(new OnClickListener() {
            public 
void onClick(View v) {
                if (
btconnectingst.equals(1)) {
                    
mConnectedThread.write("0");    // Отправляем через Bluetooth цифру 0
                
}
            }
        });

        
= new Handler() {
            public 
void handleMessage(android.os.Message msg) {
                switch (
msg.what) {
                    case 
RECIEVE_MESSAGE:                                                   // если приняли сообщение в Handler
                        
byte[] readBuf = (byte[]) msg.obj;
                        
String strIncom = new String(readBuf0msg.arg1);
                        
sb.append(strIncom);                                                // формируем строку
                        
int endOfLineIndex sb.indexOf("\r\n");                            // определяем символы конца строки
                        
if (endOfLineIndex 0) {                                            // если встречаем конец строки,
                            
String sbprint sb.substring(0endOfLineIndex);               // то извлекаем строку
                            
sb.delete(0sb.length());                                      // и очищаем sb
                            
txtArduino.setText(sbprint);                                   // обновляем TextView
                            
btnOff.setEnabled(true);
                            
btnOn.setEnabled(true);
                        }
                        break;
                }
            }
        };
 }

    
BroadcastReceiver mybroadcast = new BroadcastReceiver() {
        @
Override
        
public void onReceive(Context contextIntent intent) {
            if(
intent.getAction().equals(Intent.ACTION_SCREEN_ON)){
                
checkBTState();
            }
            else if(
intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
                if (
btconnectingst.equals(1)){
                    
btconnectingst 0;
                    
mConnectedThread.cancel();
                }
            }

        }
    };


    private 
void errorExit(String titleString message){
        
Toast.makeText(getBaseContext(), title " - " messageToast.LENGTH_LONG).show();
    }



    private 
void checkBTState() {
        if(
btAdapter==null) {
        } else {
            if (
btAdapter.isEnabled()) {
                
ConnectBT();
                
btconnectingst 1;
            } else {
                
Intent enableBtIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE);
                
startActivityForResult(enableBtIntentREQUEST_ENABLE_BT);
            }
        }
    }

    @
Override
    
protected void onActivityResult(int requestCodeint resultCodeIntent data) {
        if(
requestCode == REQUEST_ENABLE_BT){
            if (
resultCode == RESULT_OK){
                
ConnectBT();
                
btconnectingst 1;
            }
            if(
resultCode == RESULT_CANCELED){
                
finish();
            }
        }
    }

    @
Override
    
public void onResume() {
        
super.onResume();
        
checkBTState();
    }

    @
Override
    
public void onPause() {
        
//тут возникает проблема если ВТ выключен!
        //Видимо из за того, что пытамся закрыть несуществующий сокет.
        //Нужно записывать в переменную статус адаптера!
        
super.onPause();
        if (
btconnectingst.equals(1)) {
            
btconnectingst 0;
            
mConnectedThread.cancel();
        }
    }

    public 
void ConnectBT() {
        
btAdapter.cancelDiscovery();
        for (
BluetoothDevice device btAdapter.getBondedDevices()) {
            try {
                try {
                    
Method m device.getClass().getMethod("createRfcommSocket",new Class[] { int.class });
                    try {
                        
BluetoothSocket btSocket = (BluetoothSocket)  m.invoke(device,Integer.valueOf(1));
                        
btSocket.connect();
                        
mConnectedThread = new ConnectedThread(btSocket);
                        
mConnectedThread.start();
                        break;
                    } catch (
IOException e) {}
                }
                catch (
IllegalArgumentException e) {}
                catch (
IllegalAccessException e) {}
                catch (
InvocationTargetException e) {}
            } catch (
SecurityException e) {}
            catch (
NoSuchMethodException e) {}
        }
    }

    private class 
ConnectedThread extends Thread {
        private final 
BluetoothSocket mmSocket;
        private final 
InputStream mmInStream;
        private final 
OutputStream mmOutStream;

        public 
ConnectedThread(BluetoothSocket socket) {
            
mmSocket socket;
            
InputStream tmpIn null;
            
OutputStream tmpOut null;

            
// Get the input and output streams, using temp objects because
            // member streams are final
            
try {
                
tmpIn socket.getInputStream();
                
tmpOut socket.getOutputStream();
            } catch (
IOException e) { }

            
mmInStream tmpIn;
            
mmOutStream tmpOut;
        }

        public 
void run() {
            
byte[] buffer = new byte[256];  // buffer store for the stream
            
int bytes// bytes returned from read()

            // Keep listening to the InputStream until an exception occurs
            
while (true) {
                try {
                    
// Read from the InputStream
                    
bytes mmInStream.read(buffer);        // Получаем кол-во байт и само собщение в байтовый массив "buffer"
                    
h.obtainMessage(RECIEVE_MESSAGEbytes, -1buffer).sendToTarget();     // Отправляем в очередь сообщений Handler
                
} catch (IOException e) {
                    break;
                }
            }
        }

        
/* Call this from the main activity to send data to the remote device */
        
public void write(String message) {
            
byte[] msgBuffer message.getBytes();
            try {
                
mmOutStream.write(msgBuffer);
            } catch (
IOException e) {
            }
        }

        
/* Call this from the main activity to shutdown the connection */
        
public void cancel() {
            try {
                
mmSocket.close();
            } catch (
IOException e) { }
        }
    }

xml
PHP код:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/activity_main" tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Text From Arduino"
        android:id="@+id/txtArduino"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_above="@+id/btnOn"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="1"
        android:id="@+id/btnOn"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginBottom="37dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        android:id="@+id/btnOff"
        android:layout_alignBottom="@+id/btnOn"
        android:layout_toRightOf="@+id/btnOn"
        android:layout_toEndOf="@+id/btnOn" />
</RelativeLayout>
T_r_D вне форума   Ответить с цитированием
Старый 23.12.2015, 21:37   #117
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Условия для работы.
bluetooth устройства должны быть сопряжены.
В списке сопряжонных устройств должно быть только то, которое является модулем hc-05.
Ардуина и модуль должны включаться ДО выхода планшета из слипа или ДО его загрузки в случае автоматического запуска программы при старте.

Концом стороки является \r\n при посылках из ардуины.

События которые происходят в программе.
Запуск
Если БТ включён, то коннектимся.
Если выключен, то просим пользователя включить.
Если включил- коннектимся, если нет- выходим из программы.
Свёртывание программы- дисконнект ВТ.
Развёртывание- коннект.
Уход в слип (потухание экрана)- дисконнект
Возвращение из слипа (включение экрана)- коннект.

Во вложении АПК.
Вложения
Тип файла: rar BT.rar (1.10 Мб, 564 просмотров)
T_r_D вне форума   Ответить с цитированием
Старый 06.01.2016, 21:04   #118
autowp
Пользователь
 
Аватар для autowp
 
Регистрация: 13.12.2012
Возраст: 41
Город: Москва
Регион: 77, 97, 99, 177
Машина: Peugeot 407 Coupe
Сообщений: 82
autowp is on a distinguished road
По умолчанию

Я тут переписал старую как мир библиотеку под MCP2515 от SeedStudio
https://github.com/Seeed-Studio/CAN_BUS_Shield

Вот что вышло
https://github.com/autowp/CAN_BUS_Shield

А вот пример приложения на базе этой библиотеки:
https://github.com/autowp/can-usb - эмулятор CanHacker'а (lawicel).

Пока не работают только фильтры/маски.

Цель переписывания была в том, чтобы обеспечить безошибочную работу на высоких скоростях. С оригинальной библиотекой очень много потерь было. Переписанная тянет полный загруз UART на 115200 (эффективная скорость данных 87Кбит). Дальше не мерял, потому как это предел для программы, под которую делалось (CanHacker http://www.mictronics.de/projects/usb-can-bus/ )

P.S.
Ах, да, забыл упомянуть, что я всё делаю на Arduino Nano.
На Arduino Uno у меня не заработало, потому что она слишком долго загружается и не успевает принять от CanHacker'а команду на подключение. Возможно с иным бутлоадером и заработает, но мне не очень хочется разбираться
autowp вне форума   Ответить с цитированием
Старый 07.01.2016, 15:17   #119
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

А я тут опять в стопоре!
Запутался в трёх соснах.
В скетче указывают delay(100) и всё работает, делаю задержку через millis и не фига не работает!
Тоесть сообщения-то идут, но похоже быстрее чем с делеем и поэтому для андройде это уже каша, а не то что должно быть.
Сколько не смотрел в инете и всё говорят про то, что внутренний таймер считает по микросекундам и соответственно 100 millis должно быть эквивалентом delay(100).
Может это только с промикро такие глюки?
T_r_D вне форума   Ответить с цитированием
Старый 07.01.2016, 19:02   #120
autowp
Пользователь
 
Аватар для autowp
 
Регистрация: 13.12.2012
Возраст: 41
Город: Москва
Регион: 77, 97, 99, 177
Машина: Peugeot 407 Coupe
Сообщений: 82
autowp is on a distinguished road
По умолчанию

Цитата:
Сообщение от T_r_D Посмотреть сообщение
А я тут опять в стопоре!
Запутался в трёх соснах.
В скетче указывают delay(100) и всё работает, делаю задержку через millis и не фига не работает!
Тоесть сообщения-то идут, но похоже быстрее чем с делеем и поэтому для андройде это уже каша, а не то что должно быть.
Сколько не смотрел в инете и всё говорят про то, что внутренний таймер считает по микросекундам и соответственно 100 millis должно быть эквивалентом delay(100).
Может это только с промикро такие глюки?
millis - это не задержка, а текущее время.
В нормальной программе delay быть не должно.
autowp вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 5 (пользователей: 0 , гостей: 5)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Часовой пояс GMT +4, время: 02:02.


Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot