Spanish GPIO en Basic4Android

Drew75

Member
Licensed User
Longtime User
Hola gente del Foro!!!!

Este es mi primer post y mi primer post en español. realmente no lo puedo creer!! siempre tuve que escribir en ingles y no es lo mismo....bueno. aca va mi problemita:

Esta mañana me ha llegado mi placa OLIMEX A20 Olinuxino MICRO corriendo Android. Esta placa la voy a utilizar para fabricar un PLC y ya que la placa cuenta con GPIO incluidas quiero poder usarlas. El problema es que no se como hacer esto. tengo mi programa desarrollado en Basic4android porque no quiero complicarme con el C o con java pero veo que no es tan facil la cosa. La ayuda de Olimex para desarrollos sobre android dice lo siguiente:

*) GPIO using Android SDK
Basicly you should read and write to the filesys. Make sure that
your app is running as root, or else nothing will happen.
The demo program toggle LED1 on every button press.
All read/write methods are realized in GPIO.java file.

Es posible leer y escribir el archivo filesys desde Basic4Android???

El archivo GPIO.java es el siguiente:
B4X:
package olimex.a10s.toogleled;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;



public class GPIO{
   
    public String port;
    public String ext;
    public int pin;   
   
   
    public boolean output(int value) {
        String command = String.format("echo %d > /sys/class/gpio_sw/%s/data", value, port);       
        try {
            Runtime.getRuntime().exec(new String[] {"su", "-c", command});
            return true;
        } catch (IOException e) {
            return false;
        }
    }
    public String readinput(){
        Process p;
        String command = String.format("cat /sys/class/gpio_sw/%s/data", port);
        try {
            p = Runtime.getRuntime().exec(new String[] {"su", "-c", command});
            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
            StringBuilder text = new StringBuilder();
            String line;
            while((line = reader.readLine()) != null){
                text.append(line);
                text.append("\n");
            }
            return text.toString();
        } catch (IOException e) {
            return "";
        }       
    }
    public boolean setcfg(int cfg){
        String command = String.format("echo %d > /sys/class/gpio_sw/%s/mul_sel", cfg, port);       
        try {
            Runtime.getRuntime().exec(new String[] {"su", "-c", command});
            return true;
        } catch (IOException e) {
            return false;
        }
    }
    public String readcfg(){
        Process p;
        String command = String.format("cat /sys/class/gpio_sw/%s/mul_sel", port);
        try {
            p = Runtime.getRuntime().exec(new String[] {"su", "-c", command});
            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
            StringBuilder text = new StringBuilder();
            String line;
            while((line = reader.readLine()) != null){
                text.append(line);
                text.append("\n");
            }
            return text.toString();
        } catch (IOException e) {
            return "";
        }
    }
    public int input(){       
        char ch;
        String cfg;
       
        cfg = readinput();
       
        if(cfg.isEmpty())
            return -1;
        else{
            ch = cfg.charAt(0);       
            if(Character.isDigit(ch))
                return Character.getNumericValue(ch);           
            else
                return -1;
        }   
    }
   
    public int getcfg(){
        char ch;
        String cfg;
       
        cfg = readcfg();
        if(cfg.isEmpty())
            return -1;
        else{
            ch = cfg.charAt(0);
            if(Character.isDigit(ch))
                return Character.getNumericValue(ch);           
            else
                return -1;
        }
    }
   
   
    //Constructor
    public GPIO(String port, String ext, int pin){
        this.port = port;
        this.ext = ext;
        this.pin = pin;
    }
       
}

Alguien tiene alguna idea como puedo hacer para controlar las GPIO de la placa desde Basic4Android???
Muchas gracias,
Andres
 

Drew75

Member
Licensed User
Longtime User
Hola Jesús, muchas gracias por contestar!!!

Estuve viendo el link y creo comprender un poco, pero tengo unas dudas: la ayuda que me dan dice que basicamente es escribir al archivo filesys y en el link se ve de qué manera puedo hacer esto. mi pregunta es: el archivo filesys es un archivo físico o es algo que existe en memoria?? tu sabes eso? consulto esto porque si yo debo escribir al archivo para modificar el valor de una salida de mi placa y esto debo hacerlo muchas veces por segundo, entonces la flash dejará de funcionar en poco tiempo debido a la limitada cantidad de escrituras que posee y entonces deberia buscar otra solucion a mi problema. Espero puedas ayudarme.
Muchas gracias, Andres
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Andres:

El ejemplo que te ponen ahi es para modificar los archivos de sistema del movil que solo puedes acceder a ellos si tienes el teléfono con root (super usuario)

He mirado las características de tu placa un poco por encima y veo que viene con Android 4.2.2, ademas tiene 3 puertos USB, uno de ellos HOST y uno OTG. No te has planteado controlar la placa enviando comandos series via USB? (no se si lo permite aunque supongo que si) .

Por otro lado, si quieres hacer un PLC, esa placa tendria que ser totalmente autónoma y admitir al menos algún programa de programación típicos de PLC'S como Diagrama de escalera o "ladder" , lista de instrucciones, bloques de funciones, Grafcet, texto estructurado, etc. Por que asi el usuario final podrá programar tu PLC, y esto es crear todo un entorno de programación y luego algo que "compile" ese programa realizado por el usuario final y que controle las entradas/salidas y con una velocidad de scan que sea aceptable, por que si te actuan una entrada y te enteras al cabo de 300 milisegundos ya es tarde depende de que tipo de control quieras hacer.
Por otro lado si quieres hacer un PLC de verdad este tendria que llevar un watchdog hard y uno soft, por que si se cuelga el programa de usuario (o Android) haciendo un control industrial, el desastre puede ser grande dependiendo del proceso industrial que controles si queda alguna señal de salida activada.

No se si realmente es esto lo que quieres hacer cuando dices "Esta placa la voy a utilizar para fabricar un PLC" , o realmente lo que quieres hacer es controlar un proceso industrial especifico para ti. Sea cualquiera de las dos formas, es mas facil que hagas tu programa y lo instales en la placa, de esa forma no necesitas comunicarte con ella a nivel de entradas/salidas, si no solo como emulador como si fuera el movil para que instale tu programa. Si lo que pretendes es desde un movil controlar las entradas/salidas, personalmente creo que esta placa se sale de esas especificaciones, ya que esta placa ella sola al tener instalado Android eso lo puede hacer ella sola. Hay otras placas "tontas" que conectandole un movil puedes controlar las entradas/salidas.


Perdona si te he desmoralizado o no era la respuesta que buscabas, pero al no saber exactamente lo que pretendes hacer, simplemente respondi a tu pregunta inicial.


Puedes ver la libreria de USB en este Link :

http://www.b4x.com/android/forum/threads/usbserial-library-2-0-supports-more-devices.28176/

Saludos:

Jesus

Nota: Mas adelante quiero hacer algo con placas, y la verdad es que esa tuya la veo muy buena.
 

Drew75

Member
Licensed User
Longtime User
Hola Jesús,

Muchas gracias por tomarte un tiempo en contestar e investigar. Hace ya mucho tiempo que fabrico plc para la industria pero estos plc, no son exactamente los que irias a comprar a un proveedor. son fabricados a medida. te comento como es la cosa: yo diseño el hardware dependiendo de la aplicación, hago el sistema operativo de ese hard para que a través de una pantalla táctil, puedas ingresar al menú y configurar todos los parametros de la maquina que estas controlando y luego también hago el software o programa ladder que ejecutará el plc para que la maquina haga lo que quiero. luego lo vendo a una empresa que fabrica la parte mecánica y eso es todo jaja.
El tema es que cuando fabrico un nuevo plc, me toma muchísimo tiempo hacer el sistema operativo. cosas que ya están resueltas en android. es decir: no quiero ponerme a fabricar un objeto botón para que cuando lo presiones ejecute un evento que hace tal cosa... me explico? eso ya está hecho y yo quiero aprovecharlo.
Quiero enfocarme a realizar el programa que genera los movimientos de la maquina, mas que en el sistema operativo. esta placa de olimex me pareció muy buena porque tiene acceso a entradas y salidas que yo preciso, pero dentro de todas las cosas que tendría que controlar, también tengo muchos motores de paso y preciso para esto, bases de tiempo muy precisas que no se si voy a conseguir en android. en realidad tengo muchas preguntas y dudas porque nunca trabajé en android o linux. siempre con microcontroladores. lo mas sencillo es como decís vos, conectar una placa a traves de usb y que todo el control de entradas y salidas las maneje esta segunda placa, pero la verdad que queria evitarlo si fuera posible porque seria entonces lo que ya tengo. lo que me ahorraria seria desarrollar el sistema operativo que no es poco. jaja. tengo que pensar bien qué hacer. de todas maneras voy a ver el link para hacer pruebas con usb y tratar de seguir investigando. Estamos en contacto y no te preocupes que no me has desmoralizado!! ya estoy acostumbrado a tener siempre un problema que resolver jaja. Saludos y gracias!!!!
 

salim safran

Member
Licensed User
Longtime User
Drew75 i am really interested to know how far did u go with OLIMEX A20 Olinuxino on Android with basic4android, any feed back will be highly appreciated.
thanks
 

JoanRPM

Active Member
Licensed User
Longtime User
Muy interesante esta placa.
Yo también hago diseños con micros, interfaces hombre/máquina, ...
Hace un tiempo me planteé (incluso) utilizar una tableta para hacer un nuevo interface. Con b4a seria muy fácil.
Esta placa puede ser muy interesante.
Cuando tenga tiempo, investigaré.
Saludos.
 

Drew75

Member
Licensed User
Longtime User
Hola JoanRPM,

Estoy en lo mismo, pero realmente no se si es posible hacer algo complejo programando en basic sobre android. depende de lo que uno quiera hacer. Yo creo que si los tiempos de escaneo no son prioridad, calculo que se podrian usar las GPIO de la placa...ahora, cuando precisamos usar entradas por interrupción porque la prioridad es el tiempo...yo no se...hay que investigar. incluso hacer una salida con una frecuencia fija y estable lo veo medio complicado al no tener el control del procesador. Lo que sí está bueno, es la interfaz gráfica que nos daria android y la facilidad de la programacion en Basic4ppc y todo el potencial en manejo de bases de datos, archivos y demas. si haces algo con esto y puedes postear tus logros, te agradeceria mucho. por ahora, mi A20, la tengo guardada en una caja a la espera de tiempo para investigar. de todas maneras, no sé como manejar desde basic4ppc las gpio jaja. tengo que estudiar un poco todavia.
Saludos!!!
 

salim safran

Member
Licensed User
Longtime User
Drew75, thank for your effort, I contacted OLIMEX and waiting to see how to control the PWM under android, as i am not sure it is supported yet, right now OLIMEX is close also heard about Radxa rock board, right now i am writing my applications using arm mcu's without OS, once I see working board with acceptable GPIO under android will then swap all my work to be under basic4andropid. hope to see results soon as such tool will give another dimension to how much will be easy to fabricate super embedded application in days not not months.
 

salim safran

Member
Licensed User
Longtime User
i got Pcduinio working with basic4android, as far the digital inputs and analogue but still evaluating some patches from them to perfect the pwm settings on android, as far the analog inputs seems to be very stable and accurate. I tried to do 400 samples each 50ms , it does work but some how it is holding the os to respond till gets done, am not sure it is basic4android issue or it is android os latency on such application. will keep working on it and when i get good news will update here. they are coming with pcduino v3 with a20 chip hopefully that will get me the speed i need.
 

bazibulo

Member
Licensed User
Longtime User
i got Pcduinio working with basic4android, as far the digital inputs and analogue but still evaluating some patches from them to perfect the pwm settings on android, as far the analog inputs seems to be very stable and accurate. I tried to do 400 samples each 50ms , it does work but some how it is holding the os to respond till gets done, am not sure it is basic4android issue or it is android os latency on such application. will keep working on it and when i get good news will update here. they are coming with pcduino v3 with a20 chip hopefully that will get me the speed i need.

Hello. Do you have an example for the control of the GPIO Pcduino with b4A ? Thanks a lot.
 

salim safran

Member
Licensed User
Longtime User
Bazibudo, i am fixing new machine with win7 64 bit, and moving b4a to the new machine, I will post the code here max by the weekend till i get my machine setup right., also received help from pcduino to have the pwm working on it with certain patch , i am not happy with performance of the delay to access analogs at fast sampling and working to setup up QT c++ to check it to see is it a bug in b4a or issue in android latency , my test will be performed on android and linux and will include also beaglebone and raspberry pi.
 

salim safran

Member
Licensed User
Longtime User
ok bazi the attached file will show how to read the 6 analoge channels and index their values respectively, u need to download the below patch ,

https://github.com/pcduino/modules/tree/master/pcduino-pwm-sysfs

for android Replace uImage
1. copy uImage to usb disk
2. open terminal apk, run these commands

$ su
# busybox mount /dev/block/nanda /mnt/extsd/
# busybox cp /mnt/usbhost1/uImage /mnt/extsd/ && sync
# busybox umount /mnt/extsd
# reboot -n 1

check http://learn.linksprite.com/pcduino/arduino-ish-program/pwm/pwm-sysfs-support-for-pcduino/

good luck
 

Attachments

  • pcduinio01.zip
    8.6 KB · Views: 384
Last edited:
Top