EMBEDDED PROJECTS JOURNAL
100% frei und kostenlos,
als PDF und in gedruckter Form,
per Open Source Lizenz
AVR-RISC (Infos)
Embedded Software selbst entwickeln
(inkl. Absatz über USBprog)
AVR-Starterkit für 61,90 EUR
Quicklinks: Home | Online Firmware Pool | Shop
     

 

Octopus Schnittstellen Wandler und I/O Erweiterung für den PC

Kontakt: Benedikt Sauter, sauter@ixbat.de 

Was ist Octopus?

 

Octopus (bestellbar über EmbeddedProjects Shop )

Octopus bietet viele bekannt Schnittstellen aus der Mikrocontrollerwelt über ein einfaches USB Gerät an. Da die Software komplett als Open Source freigegeben ist, und die Bauteile für das Gerät einfach und günstig zu bekommen sind, ist Octopus der ideale Wegbegleiter bei Versuchen, Bastelein oder als Werkzeug für die Entwicklung.

 
Alle Schaltpläne und Quelltexte von der Firmware bis zu den Bibliotheken und Treibern sind als Open Source freigegeben.

Octopus kann als vormontierter Bausatz über den Embedded Projects Shop bezogen werden. Link zum Shop 

Online-Shop: Bestellen über Embedded Projects Shop

 

Features:

  • 2   x UART (RS232 Schnittstelle aber nur RX und TX)
  • 1   x I2C Bus (Master)
  • 1   x SPI Schnittstelle
  • 2   x PWM Signale
  • 8   x Analog Digital Wandler
  • 38 x Digitale I/O Ports

 

 

Zugriff auf OctopusUSB

Auf Octopus kann man entweder in Linux, Windows und Mac über eine Bibliothek zugreifen. Deweiteren gibt es für Linux ein Kernel Modul, dass viele Schnittstellen von Octopus als echte Linux Geräte einbindet ( /dev/ttyUSB0, /dev/i2c usw...).

Eine weitere Alternative ist das bald hoffentlich fertige openXIO Lab Programm. openXIO Lab ist ein "Elektronik-Labor" für den Computer. Mit der Oberflaeche kann man die Funktionen von Octopus bequem ansteuern. Desweiteren gibt es viele Bibliotheken in verschiedenen Programmiersprachen, mit denen man ebenfalls direkt die Funktionen ansteuern kann (Port ein-/ausschalten, Analogwert messen, ein i2c Gerät ansteuern usw...).  Hier gibt es mehr Informationen dazu.

 
 ACHTUNG (Die beiden äusseren Reihen sind Masse! Die Signale liegen auf den inneren Reihen!)
 

 

Installation von OctopusUSB

Der Octopus ist aktuell noch nicht programmiert wenn er ausgeliefert wird. Daher muss man folgendes für die Inbetrienahme erledigen:

  1. Herunterladen der aktuellen Firmware: http://octopususb.googlecode.com/svn/trunk/firmware/main.hex
  2. Mit einem AVR Programmiergerät die Firmware auf Octopus übertragen (Achtung - Standardmässig läuft der ATMega128 mit nur 1 MHz, was bedeutet das die ISP Geschwindigkeit auf min. 250 kHz (max. 1/4 des CPU Taktes) gedrosselt werden muss.
  3. Einstellen der Fuse Bits (mit avrdude: lfuse 0xe0, hfuse = 0xdd und efuse 0xff)
  4. Nach dem anstecken sollte an den sieben LEDs auf Octopus eine kurze Blinksequenz abgespielt werden.

Installation der Treiber

Um Octopus verwenden zu können, wird ein Treiber benötigt. Für Windows gibt es ein Treiberpaket zum Herunterladen im Bereich Downloads. In Linux und & Co. hingegen reich es nur die Bibliothek libusb einmalig zu installieren.

Abhängig von der gewünschten Zielsprache kann ein Beispiel aus dem Quelltextarchiv inkl. der Beschreibung als Ausgangslage verwendet werden. Das Quelltextarchiv ist über die Navigation Downloads erreichbar.

 

Support

Bei Fragen, Problemen oder sonstigen Idee meldet euch am besten an unserem Forum für Octopus an. Dies findet Ihr hier:  http://forum.embedded-projects.net/viewforum.php?id=14

 

 

Downloads

API

Diese API wird für viele Programmiersprachen angeboten. Fehlt die Unterstützung für eine bestimmte Programmiersprache, so schreibt einfach eine Anfrage in das Forum.

/***************************************************************************
                          octopus.h  -  description
                             -------------------
    begin                : Fri Oct 25 2007
    email                : sauter@ixbat.de
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU Lesser General Public License           *
 *   version 2.1 as published by the Free Software Foundation;             *
 *                                                                         *
 ***************************************************************************/

#ifndef __liboctopus_h__
#define __liboctopus_h__

#include <usb.h>


#define VID 0x1781
#define PID 0x0c65

/**
  \brief Main context structure for all liboctopus functions.

 Do not access directly if possible.
*/
struct octopus_context {
    // USB specific
    /// libusb's usb_dev_handle
    struct usb_dev_handle *usb_handle;

    /// String representation of last error
    char *error_str;
};

/**
    \brief list of usb devices created by octopus_usb_find_all()
*/
struct octopus_device_list {
    /// pointer to next entry
    struct octopus_device_list *next;
    /// pointer to libusb's usb_device
    struct usb_device *dev;
};

#ifdef __cplusplus
extern "C" {
#endif

  int octopus_init(struct octopus_context *octopus);
 
  int octopus_open(struct octopus_context *octopus);
  int octopus_open_id(struct octopus_context *octopus, int vendor, int product);
  int octopus_open_serial(struct octopus_context *octopus, char * serial);

  int octopus_open_dev(struct octopus_context *octopus, struct usb_device *dev);
 
  int octopus_close(struct octopus_context *octopus);
  int octopus_reset(struct octopus_context *octopus);

  int octopus_status(struct octopus_context *octopus);
  int octopus_logging(struct octopus_context *octopus);
 
  char * octopus_get_hwdesc(struct octopus_context *octopus, char *desc);

  /// part: IO
 
  int octopus_io_init(struct octopus_context *octopus, int pin);
  int octopus_io_init_port(struct octopus_context *octopus, int port);
 
  int octopus_io_set_port_direction_out(struct octopus_context *octopus, int port,unsigned char mask);
  int octopus_io_set_port_direction_in(struct octopus_context *octopus, int port, unsigned char mask);
  int octopus_io_set_port_direction_tri(struct octopus_context *octopus, int port, unsigned char mask);

  int octopus_io_set_pin_direction_out(struct octopus_context *octopus, int pin);
  int octopus_io_set_pin_direction_in(struct octopus_context *octopus, int pin);
  int octopus_io_set_pin_direction_in_pullup(struct octopus_context *octopus, int pin);
  int octopus_io_set_pin_direction_tri(struct octopus_context *octopus, int pin);

  unsigned char octopus_io_get_port(struct octopus_context *octopus, int port);
 
  int octopus_io_set_port(struct octopus_context *octopus, int port, unsigned char value);
 
  int octopus_io_set_pin(struct octopus_context *octopus, int pin, int value);    //buffered

  int octopus_io_get_pin(struct octopus_context *octopus, int pin);

  /// part: adc
 
  int octopus_adc_init(struct octopus_context *octopus, int pin);
  int octopus_adc_get(struct octopus_context *octopus, int pin);
  int octopus_adc_ref(struct octopus_context *octopus, int ref);
  // 1= extern AREF, 2 = AVCC as reference, 3=intern voltage


  /// part: I2C
  int octopus_i2c_init(struct octopus_context *octopus);
  int octopus_i2c_deinit(struct octopus_context *octopus);
  
  int octopus_i2c_speed(struct octopus_context *octopus, int speed);
 
  int octopus_i2c_start(struct octopus_context *octopus);
  int octopus_i2c_stop(struct octopus_context *octopus);
  int octopus_i2c_restart(struct octopus_context *octopus);

  int octopus_i2c_slave_address(struct octopus_context *octopus, unsigned char address);

  int octopus_i2c_send(struct octopus_context *octopus, unsigned char * data, int length);
  unsigned char octopus_i2c_recv(struct octopus_context *octopus, int length);
 
  int octopus_i2c_recv_ack(struct octopus_context *octopus);
  int octopus_i2c_send_ack(struct octopus_context *octopus);
  int octopus_i2c_send_nack(struct octopus_context *octopus);
 
  /// part: UART
  int octopus_uart_init(struct octopus_context *octopus, int uartport);
  int octopus_uart_deinit(struct octopus_context *octopus, int uartport);

  int octopus_uart_default(struct octopus_context *octopus, int uartport); //9600 8N1
  int octopus_uart_speed(struct octopus_context *octopus, int uartport, int speed);
  int octopus_uart_stopbits(struct octopus_context *octopus, int uartport, int stopbits);
  int octopus_uart_databits(struct octopus_context *octopus, int uartport, int databits);
  int octopus_uart_parity(struct octopus_context *octopus, int uartport, int parity);

  int octopus_uart_send(struct octopus_context *octopus, int uartport, unsigned char * buf, int length);
  int octopus_uart_recv(struct octopus_context *octopus, int uartport, unsigned char * buf, int length);

  /// part: SPI
  int octopus_spi_init(struct octopus_context *octopus);
  int octopus_spi_deinit(struct octopus_context *octopus);
 
  int octopus_spi_speed(struct octopus_context *octopus, int speed);
  int octopus_spi_send(struct octopus_context *octopus, unsigned char * buf, int length);
  int octopus_spi_recv(struct octopus_context *octopus, unsigned char * buf, int length);
  int octopus_spi_send_and_recv(struct octopus_context *octopus, unsigned char * buf, int length);


#ifdef __cplusplus
}
#endif

#endif /* __liboctopus_h__ */
 © 2007 by Embedded Projects, Benedikt Sauter