I2C Display och Arduino

Berätta om dina pågående projekt.
Användarvisningsbild
4kTRB
Inlägg: 18416
Blev medlem: 16 augusti 2009, 19:04:48

Re: I2C Display och Arduino

Inlägg av 4kTRB »

Ja å det såg inte jag.
Det ska väl finnas editorer för tecken som ger C-koden.
Men hur det går till praktiskt har jag aldrig utfört, möjligtvis när jag höll på med 68000
och Amiga. Vi konstruerade ett pcb att sticka in i porten baktill på Amigan och sedan
höll jag kurs i hur vi skulle skriva tecken till en ansluten LCD. Det hela utfördes i assembler
med hjälp av Dev-Pac. Förmodligen ett sådan där HD-chip från Hitachi.
Användarvisningsbild
4kTRB
Inlägg: 18416
Blev medlem: 16 augusti 2009, 19:04:48

Re: I2C Display och Arduino

Inlägg av 4kTRB »

Nu när jag läst på om FTDI så finns en del kul projekt bland annat att
köra SPI och till exempel styra en "LED-modul 7-segment 8 siffror seriell"
typ https://www.electrokit.com/produkt/led- ... r-seriell/,
eller till exempel en AD9850.
https://github.com/swharden/AVR-project ... /readme.md
https://swharden.com/blog/2018-06-03-bi ... i-devices/
Användarvisningsbild
4kTRB
Inlägg: 18416
Blev medlem: 16 augusti 2009, 19:04:48

Re: I2C Display och Arduino

Inlägg av 4kTRB »

Då ser jag nu varför det blir olika tecken,

då engelska pund-tecknet knappas in på datorn (från min bild på sidan 1)
fås ett bakvänt "L" på LCD:n.

Adressen 1010 0011 har olika tecken på 1602 och HD.

Betyder det att HD-kretsen anses som mer standard?
Användarvisningsbild
4kTRB
Inlägg: 18416
Blev medlem: 16 augusti 2009, 19:04:48

Re: I2C Display och Arduino

Inlägg av 4kTRB »

Laddar jag hem och installerar drivrutiner för min FTDI-adapter fås 2 drivrutiner.
Windows plockar VCP-drivrutinen och sammanbinder den med en inställbar port i enhetshanteraren.
Avmarkeras VCP så kommer fortfarande D2XX.drivrutinen att vara i funktion och då den enda som finna om jag förstår det hela riktigt.
"FTDI provides DLL and virtual COM port (VCP) application interfaces to its drivers."

Så jag håller på med att koda ett program för att ta reda på mer och som kanske mynnar ut i något användbart.

Som synes fås -1 som resultat när ansluten COM-port skrivs ut då VCP är inaktiverad.
D2XX är typ en direktkontakt med chippet på något sätt.

https://www.ftdichip.com/Support/Docume ... 00071).pdf
VCP_Active_D2XX_EH.jpg
VCP_Active_D2XX.jpg
VCP_Not_Active_D2XX_EH.jpg
VCP_Not_Active_D2XX.jpg
Och här är java-programmet....

GUI

Kod: Markera allt

package start;

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import d2xx.D2XX;
import net.sf.yad2xx.FTDIException;
import java.awt.Font;
import java.awt.Color;
import javax.swing.border.BevelBorder;
import threadController.ThreadController;
import javax.swing.JTextArea;
import java.awt.Dimension;

public class D2XXGUI {

	private static final int NUMBEROFTHREADS = 1;								// Antalet objekt som ska köras som en tråd	
	private JFrame frmDxxFtrSoftware;
	private JPanel panel;
	private JButton btnExitButton;
	private JButton btnCloseDxxDevice;
	private JButton btnOpenDxxDevice;
	private Object tc0 = null;													// objekt som ska köras av trådkontrollern
	private static ThreadController[] threadController;							// varje tråd har en trådkontroller
	private static Thread[] threadControllerThread;								// varje trådkontroller körs som en tråd
	private static JTextArea textArea_0;
	private JButton btnStart;
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					D2XXGUI window = new D2XXGUI();								// Ett fönsterbaserat GUI
					window.frmDxxFtrSoftware.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	
	/**
	 * Create the application.
	 * @throws InterruptedException 
	 */
	public D2XXGUI() throws InterruptedException {
		initialize();															// Konstruera GUI
		setUpThreadControllers();
	}

	private void setUpThreadControllers() {												
		tc0 =  new D2XX();														// skapa ett objekt
		threadController = new ThreadController[D2XXGUI.NUMBEROFTHREADS];		// skapa en array att hålla ett antal trådkontroller
		threadControllerThread = new Thread[D2XXGUI.NUMBEROFTHREADS];			// skapa en array som håller ett antal trådar
		threadController[0] = new ThreadController(tc0);						// skapa en trådkontrollerobjekt för objektet EchoD2xx			
	//	threadControllerThread[0] = new Thread (threadController[0]);			// skapa en tråd av varje trådkontroller
																				// threadControllerThread[0] håller nu en tråd av en trådkontroller som ännu inte startats
	}
	
	/*
	 * Tar emot text att addera till en textarea
	 */
	public static void addTextTA(String text) {
		textArea_0.append(text + "\n");
	}
	
	/*
	 * Tömmer textarean på innehåll
	 */
	public static void eraseTextFromTextArea() {
		textArea_0.setText(null);
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frmDxxFtrSoftware = new JFrame();
		frmDxxFtrSoftware.setMaximumSize(new Dimension(800, 600));
		frmDxxFtrSoftware.setFont(new Font("BankGothic Md BT", Font.BOLD, 12));
		frmDxxFtrSoftware.setTitle("D2XX FT232R SOFTWARE");
		frmDxxFtrSoftware.setResizable(false);
		frmDxxFtrSoftware.setBackground(new Color(0, 0, 0));
		frmDxxFtrSoftware.getContentPane().setBackground(new Color(0, 0, 0));
		frmDxxFtrSoftware.getContentPane().setForeground(new Color(254, 254, 0));
		frmDxxFtrSoftware.setBounds(100, 100, 707, 545);
		frmDxxFtrSoftware.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmDxxFtrSoftware.getContentPane().setLayout(null);

		panel = new JPanel();
		panel.setBackground(new Color(47, 79, 79));
		panel.setBounds(10, 415, 671, 79);
		panel.setLayout(null);
		frmDxxFtrSoftware.getContentPane().add(panel);
		
		//====================================================================================================== START-knapp	
		btnStart = new JButton("START");
		btnStart.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent e) {												// status = true om objektets run() körs = objektet tråd har startats
				if(!((D2XX)tc0).getStatus()) {													// om ingen tråd ännu startats av trådkontrollern så					
					threadControllerThread[0] = new Thread (threadController[0]); 					// skapa en tråd utav trådkontrollern och
					threadControllerThread[0].start();												// starta den trådkontrollern
				}																					// den här trådkontrollern körs nu som en tråd					
			}			
		});
		btnStart.setFont(new Font("Trebuchet MS", Font.PLAIN, 15));
		btnStart.setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
		btnStart.setBackground(Color.WHITE);
		btnStart.setBounds(10, 11, 120, 23);
		panel.add(btnStart);
		
		//====================================================================================================== OPEN D2xxx Device-knapp
		// Hittar D2XX ansluten enheten till COM-port och öppnar enheten för datatrafik
		btnOpenDxxDevice = new JButton("OPEN D2XX Device");
		btnOpenDxxDevice.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent e) {
				if(((D2XX)tc0).getStatus()) {				
					try {
						((D2XX)tc0).D2xxSetUp();
					} catch (FTDIException e1) {
						e1.printStackTrace();
					}
				}
			}
		});
		btnOpenDxxDevice.setFont(new Font("Trebuchet MS", Font.PLAIN, 15));
		btnOpenDxxDevice.setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
		btnOpenDxxDevice.setBackground(Color.WHITE);
		btnOpenDxxDevice.setBounds(140, 11, 167, 23);
		panel.add(btnOpenDxxDevice);
		
		//====================================================================================================== CLOSE D2xxx Device-knapp
		// Stänger öppnad anslutning 
		btnCloseDxxDevice = new JButton("CLOSE D2XX Device");
		btnCloseDxxDevice.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent e) {
				if(((D2XX)tc0).getStatus()) {		
					((D2XX)tc0).closeD2xx();
				}
			}
		});
		btnCloseDxxDevice.setFont(new Font("Trebuchet MS", Font.PLAIN, 15));
		btnCloseDxxDevice.setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
		btnCloseDxxDevice.setBackground(Color.WHITE);
		btnCloseDxxDevice.setBounds(140, 48, 167, 23);
		panel.add(btnCloseDxxDevice);

		//====================================================================================================== EXIT-knapp	
		// Avslutar programmet
		btnExitButton = new JButton("EXIT");
		btnExitButton.setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
		btnExitButton.setBackground(new Color(255, 255, 255));
		btnExitButton.setFont(new Font("Trebuchet MS", Font.PLAIN, 15));
		btnExitButton.setBounds(10, 48, 120, 23);
		btnExitButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent e) {
							System.out.println("EXIT");
							System.out.println("Avslutar " + threadController[0].toString());
							System.exit(0);
			}
		});
		panel.add(btnExitButton);

		//========================================================================== Textarea att printa info i
		textArea_0 = new JTextArea();
		textArea_0.setBackground(new Color(253, 245, 230));
		textArea_0.setForeground(new Color(0, 0, 0));
		textArea_0.setFont(new Font("Monospaced", Font.ITALIC, 14));
		textArea_0.setRows(50);
		textArea_0.setBounds(10, 11, 671, 393);
		frmDxxFtrSoftware.getContentPane().add(textArea_0);

	}
}

Koden som utför uppkoppling och utskrift...

Kod: Markera allt

package d2xx;

import static net.sf.yad2xx.FTDIConstants.*;
import net.sf.yad2xx.Device;
import net.sf.yad2xx.FTDIException;
import net.sf.yad2xx.FTDIInterface;
import start.D2XXGUI;

/*
 * Om COM-porten där FTDI-adaptern är ansluten är konfigurerad med D2XX så
 * är den dold i windows
 */
public class D2XX implements Runnable {
	private boolean stopSignal;
	private volatile static boolean status;

	// Get available FTDI Devices
	private Device dev;
	/*
	 * Konstruktor
	 */
	public D2XX() {
		D2XX.status = false;
		this.stopSignal = false;
		dev= null;
	}
	/*
	 * Ett objekt av klassen Echo2xx kör som tråd och när tråden startas
	 * startar run()
	 */
	public void run() {
		D2XX.status = true;
		D2XXGUI.addTextTA(" ========================================================");
		D2XXGUI.addTextTA(" Programmet har startat");
		D2XXGUI.addTextTA(" ========================================================");
		System.out.println(this.getStatus());
	}
	public boolean getStatus() {
		return D2XX.status;
	}
	public void  D2xxSetUp() throws FTDIException {
		dev = FTDIInterface.getDevices()[0];	
		D2XXGUI.eraseTextFromTextArea();	
		if (!dev.isOpen()) {
			// rensa textArea
			D2XXGUI.addTextTA(" ========================================================");
			D2XXGUI.addTextTA(" Opening device  --->  " + dev.getDescription());
			D2XXGUI.addTextTA(" ========================================================");

			dev.open();
			D2XXGUI.addTextTA(" Device connected to COM port: -> " + dev.getComPortNumber());
		//	dev.setTimeouts(2000, 2000);
			D2XXGUI.addTextTA(" Setting -> Baudrate = " + FT_BAUD_9600);;
			dev.setBaudRate(FT_BAUD_9600);
			D2XXGUI.addTextTA(" Setting -> " + "data bits = " + FT_BITS_8 + ", stop bits = " + FT_STOP_BITS_1 + ", paritet = " + FT_PARITY_NONE);
			dev.setDataCharacteristics(FT_BITS_8, FT_STOP_BITS_1, FT_PARITY_NONE);
			D2XXGUI.addTextTA(" Setting -> flow control = " + FT_FLOW_NONE);
			dev.setFlowControl(FT_FLOW_NONE, (char) 0, (char) 0);
			D2XXGUI.addTextTA(" Device name description -> " + dev.getDescription());
			D2XXGUI.addTextTA(" Device all description -> " + dev);
			
			D2XXGUI.addTextTA(" Device connected to COM port: -> " + dev.getComPortNumber());

			// 48 45 4C 4C 4F = HELLO
			/*		byte[] data = { (byte)0x48, (byte)0x45, (byte)0x4C, (byte)0x4C, (byte)0x4F };
				System.out.println("Sending data");
				for (int i = 0; i < 3; i++) {
					System.out.println("Sending data");
						dev.write(data);					
					try { 
						Thread.sleep(1000); 
						System.out.println("Antal mottagna bytes = " + dev.getStatus().getRxBytes());
					}
					catch (InterruptedException ie) {}					
					byte[] input = new byte[5];
					dev.read(input);							
					System.out.println((char)input[0] + " " + (char)input[1]+ " " + (char)input[2]+ " " + (char)input[3]+ " " + (char)input[4]);											
				} */
		}
		else {
			D2XXGUI.eraseTextFromTextArea();
			D2XXGUI.addTextTA(" ========================================================");
			D2XXGUI.addTextTA(" Unable to open device. Maybe already open");
			D2XXGUI.addTextTA(" Closing it if already open. Try to open it again");
			D2XXGUI.addTextTA(" ========================================================");
			if(dev.isOpen())
				dev.close();
		}
	}

	/*
	 * Stänger öppnade portar. Kontrolleras ifrån GUI
	 */
	public void closeD2xx() {															
		if(dev.isOpen()) {
			try {
				D2XXGUI.eraseTextFromTextArea();
				D2XXGUI.addTextTA(" ========================================================");
				D2XXGUI.addTextTA(" Closing device  --->  " +  dev.getDescription());
				D2XXGUI.addTextTA(" ========================================================");
				dev.close();
			} catch (FTDIException e) {
				e.printStackTrace();
			}	
		}
		else {
			D2XXGUI.eraseTextFromTextArea();
			D2XXGUI.addTextTA(" ========================================================");
			D2XXGUI.addTextTA(" Nothing to Close!");
			D2XXGUI.addTextTA(" ========================================================");
		}
	}
	public Device getDevice() {
		return dev;
	}
	/*
	 * Metoden startas ifrån GUI.
	 * Ett försök utförs att skapa en datalinje till en uppkopplad serieport.
	 * En while-loop snurrar som utför aktiviteter baserat på vad som kontrolleras ifrån GUI.
	 * While-loopen kan avbrytas ifrån GUI för att koppla ned serieporten och sedan avsluta hela programmet.
	 */
	public void RunEcho() {

	}

	/*
	 * Vid tryck på knappen EXIT i GUI sätts denna stoppflagga
	 * för att avbryta while-loopen i metoden RunEcho
	 */
	public void setStopSignal() {
		this.stopSignal = true;
	}
	public boolean getStopSignal() {
		return this.stopSignal;
	}

	public String toString() {
		return "EchoD2xx";
	}

}

och så trådkontrollern...

Kod: Markera allt

package threadController;

public class ThreadController implements Runnable {	
	private Object obj;
	private Thread objectThread;
	private static final int   TIMER_INTERVAL = 500;
		
	/*
	 * Konstruktor 
	 */
	public ThreadController(Object object) {
		this.obj = object;
	}

	public void run() {	
		objectThread = new Thread( (Runnable) obj);			// skapar en ny tråd 
		objectThread.start();
		System.out.println("Trådkontrollern kör nu run");
		
		while(true) {
			try {
				Thread.sleep(TIMER_INTERVAL);
			}
			catch(InterruptedException ie) {	
				objectThread.interrupt();
			}		
		}
	}
	
	public String toString() {
		return this.obj.toString();
	}
}

Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
4kTRB
Inlägg: 18416
Blev medlem: 16 augusti 2009, 19:04:48

Re: I2C Display och Arduino

Inlägg av 4kTRB »

Funderar på om det skulle gå att styra I2C-displayen direkt med
FTDI USP-adaptern, alltså skriva kod på datorn och få det att fungera?
FT232R-kretsen som sitter monterad har stöd för I2C men inte SPI,
för SPI ska man ha ett FT232H-chip, Lite synd för det finns många kul tillämpningar för SPI.
Electrokit säljer en "Serieinterface för LCD I2C SPI" https://www.electrokit.com/produkt/seri ... d-i2c-spi/
Användarvisningsbild
4kTRB
Inlägg: 18416
Blev medlem: 16 augusti 2009, 19:04:48

Re: I2C Display och Arduino

Inlägg av 4kTRB »

Jag hade läst på för lite om FT232R för den har inget stöd för I2C.
Jag har kikat på lite fler adaptrar för just detta och här till exempel
används en PIC för att sköta det mesta I2C och SPI...
https://www.robot-electronics.co.uk/pro ... dules.html

Ska jag sedan kunna styra min Geeek-Pi LCD med en sådan adapter måste jag först förstå mig på I2C till LCD-ports-omvandlaren PCF8574,
i mitt fall från TI då hex-adressen börjar på 2, NXP-varianten börjar på 3. Det finns ingen märkeslogga tryckt på IC:n, tycker jag
de borde börja med.
https://www.ti.com/lit/ds/symlink/pcf8574a.pdf
https://www.nxp.com/docs/en/data-sheet/ ... F8574A.pdf
Här finns förslag på vad som jag ska kunna..https://electronics.stackexchange.com/q ... -connector
Användarvisningsbild
4kTRB
Inlägg: 18416
Blev medlem: 16 augusti 2009, 19:04:48

Re: I2C Display och Arduino

Inlägg av 4kTRB »

Ska börja med att montera processorn som finns på UNO-kortet och se om det fungerar ihop
med displayen och tidspulsen. Sedan flasha en ATmega328P-PU med hjälp av Arduino UNO-kortet, MISO, MOSI och SCK.
Sågade av fästet på TO220-kapseln så bygghöjden kunde minskas.
ATmega328_PCB.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar