{"payload":{"header_redesign_enabled":false,"results":[{"body":"The list of commands or \"oplets\" that Dexter knows are defined by the HashInputCMD function in the DexRun.c Firmware and are described by Dexter.instruction_type_to_function_name_map in DDE. This wiki page attempts to expand on that document to further explain the instructions. In addition to this list, the 'w' Write FPGA , and 'S' SetParameter oplets also have lists of addresses and sub-commands. To send oplet to Dexter: Oplets are sent to Dexter via a raw socket connection on port 50000 in a format fully documented in DexRun-DDE-communications . Always wait for return status after sending an oplet, before sending the next oplet. Non-movement instructions may hold for a move instruction to be sent. This helps to coordinate movement with things like end effector actuation. However, it can be confusing if you just want to e.g. turn a laser end effector on and off and nothing happens. Just send a movement command with the current positions to enable your prior command. Certain instructions are queued in the FPGA in an internal movement FIFO and executed sequentially but will instantly return a status when recieved even though the movement is not complete. These are marked as \"queued\" in the list below. Other instructions are executed as soon as they are recieved. When the queue is full, that last movement command submitted will not return a status, and DexRun will not respond to any commands until a movement is complete, opening a space on the queue. To wait for a movement to completed, use the 'F' oplet , as it will not return a status until the queue is empty. Note that the commanded position via 'a' or 'M' is added to by the PID position of 'P' or 'C'; PID positions are an offset to commanded positions. See DDE documentation for the use of the DDE version of each command. E.g. for move_to use Dexter.move_to (...) Command Format A job number, instruction number, start POSIX time, end time (unknown) and the oplet and it's parameters are sent followed by a ';' to close the line. e.g. for the 'g' (get_robot_status) oplet you might send 1 2 1528438131 undefined g ; where this is the first job, the 2nd instruction in that job, it was sent at 06/08/2018 @ 6:08am (UTC), the end time is not known (it will be set by Dexter in the returned status). Note: All these values must be present, but are not checked. e.g. 1 1 1 1 g ; works just fine and any set of numbers could be sent; the return status will simply return the same values, updating only the end time. However, that won't tell you what instruction # it's for, or when the command was sent. The purpose of the job and instruction numbers is to coordinate the return status with the command.   DDE name DexRun Description a \"move_all_joints\" MOVEALL_CMD Queued. Arguments: 5 to 7 goal joint angles in arcseconds, space separated. E.g. a 0 0 0 0 0 is home. The goal can not be changed during the move. Trapezoidal speed ramping is used with coordination so the first 5 joints arrive at their goals at the same time. Acceleration, MaxSpeed, and StartSpeed can be set via the \"S\" SetParameter oplet . Does not require calibration, works even in Open Loop mode (w/ lower accuracy). Since 2018.11.07 accepts joint 6 and 7 positions. b \"move_to\" n/a Queued. Use \"Dexter.move_to\" in DDE which calculates joint angles and sends an 'a' oplet. In DexRun, this oplet is superseded by 'M' . See: Kinematics B \"set_boundries\" SET_ALL_BOUNDRY 10 args in arcseconds: j1BoundryHigh, j1Boundrylow, j2BoundryHigh, j2Boundrylow, j3BoundryHigh, j3Boundrylow, j4BoundryHigh, j4Boundrylow, j5BoundryHigh, j5Boundrylow. Set individually with \"S\" oplet subcommands c \"capture_ad\" CAPTURE_AD_CMD C n/a PID_MOVE_TO Since 2019.10.10 Onboard kinematics move to XYZ (integer microns), with end effector in XYZ direction (unit vector), using configuration (booleans). Like 'M' but uses PID moves like 'P' instead of joint moves like 'a' . See also S PID_P and w MAX_ERROR to limit drive strength. d \"dma_read\" DMAREAD_CMD Writes the FPGA DMA data into the specified file. 3 args: Address, Length, Filename. e \"cause_dexter_error\" n/a Used only in DDE E \"empty_instruction_ queue_immediately\" Since 2016.09.01 n/a Apparently never implemented in firmware? F \"empty_instruction_ queue\" HEART_BEAT Since 2016.09.01 Queued. Does wait_fifo_flush() first. Was SET_FORCE_MOVE_POINT. This instruction will not return a status until it actually executes. Instructions before this one will be executed first. Very useful to synchronize robot motion with control software. E.g. to wait until the arm has moved to a new position before closing the gripper. f \"find_home\" FIND_HOME_CMD Depreciated Use job engine. G \"get_robot_status_ immediately\" Since 2016.09.01 HEART_BEAT (Same as 'g'?) g \" get_robot_status \" SEND_HEARTBEAT Returns the current status of the robot.//fry h \"get_robot_status_ heartbeat\" HEART_BEAT obsolete //fry i \"capture_points\" CAPTURE_POINTS_CMD Enters a sub mode where points are captured to a file on Dexter. 1 arg: Filename. Expects an input stream of commands from stdin via getchar(). No timeout. l \"load_tables\" LOAD_TABLES Writes encoder CalTables from FPGA to /srv/samba/share/HiMem.dta M n/a 1 MOVETO_CMD Since 2018.10.9 Queued Onboard kinematics move to XYZ (integer microns), with end effector in XYZ direction (unit vector), using configuration (booleans). For example to move to [0,0.5,1.0] (in meters) with the end effector pointed straight down and right_arm, elbow_up, and wrist_out: 1 1 1 1 M 0 500000 100000 0 0 -1 1 1 1 . See T and S MaxSpeed m \"record_movement\" RECORD_MOVEMENT n \"find_index\" FIND_INDEX_CMD Unused o \"replay_movement\" REPLAY_MOVEMENT P \"pid_move_all_joints\" PID_FINEMOVE Chases a goal offset on each joint using the PID control system which must be enabled. Requires calibration . The goal can change in the middle of the move. Movement is not coordinated so each joint may arrive at the goal at a different time. The standard trapezoidal speed ramping is not used. Adds to \"a\" position. Modified 201909 to optionally accept joint 6/7 angles. See kinematics for its comparison to move_all_joints. See also S PID_P and w MAX_ERROR to limit drive strength. p \"find_home_rep\" FIND_HOME_REP_CMD Depreciated Use job engine. R \"move_all_joints_ relative\" MOVEALL_RELATIVE Queued. Like 'a' but the joint is moved relative to it's prior position. E.g. R 0 0 -36000 0 0; will move joint 3 ccw 10 degrees. r \" read_from_robot \" Since v2.3.16 READ_CMD Since 2018.07.26 Reads files or string data from the robot. Also reads and prints locally values from the memory mapped FPGA interface. s \"slow_move\" SLOWMOVE_CMD Since 2018.10.9 S \" set_parameter \" SET_PARAM Sets many different values T \"move_to_straight\" 1 MOVETOSTRAIGHT_CMD Use \"Dexter.move_to_straight\" in DDE which calculates a sequence of joint angles and sends a bunch of 'a' oplets with speed settings. 'T' does onboard kinematics move in a straight line from prior 'M' oplet position to new XYZ position, direction, and configuration. See S CartesianSpeed t \"dma_write\" DMAWRITE_CMD w \" write \" WRITE_CMD Writes to the FPGA / Gateware . Does wait_fifo_flush() first. W \" write_to_robot \" Since v2.3.15-16 WRITE_TO_ROBOT Since 20180418 Send files to the Dexter file system. x \"exit\" EXIT_CMD z \"sleep\" SLEEP_CMD Queued. Pause the robot for the specified uSeconds (1 second = 1000000 uSeconds) The 'M' and 'T' oplets are not used in DDE because DDE does its own kinematics .","filename":"Command-oplet-instruction.md","format":"markdown","hl_body":"The list of commands or "oplets" that Dexter knows are defined by the HashInputCMD function in the DexRun.c Firmware and are described by Dexter.instruction_type_to_function_name_map in DDE. ...","hl_title":"Command oplet instruction","id":"f4ca4595d3ad0bd7d15eae43a308cd65038cd19d","path":"Command-oplet-instruction.md","public":true,"repo":{"repository":{"id":124001434,"name":"Dexter","owner_id":37091691,"owner_login":"HaddingtonDynamics","updated_at":"2022-06-08T17:18:45.529Z","has_issues":true}},"repo_id":124001434,"title":"Command oplet instruction","updated_at":"2021-07-07T18:46:14.000-07:00"},{"body":"Dexter Development Environment DDE allows users to develop and run software on multiple platforms to control the Dexter 5 axis robot arm. In addition to providing standard robot control functions like kinematics , it is fundamentally a JavaScript development environment with lots of extensions. See DexRun-DDE-communications for more detail about the communications between DDE and Dexter. Install DDE Links to current LTS and other versions DDE on Windows Download and run the .exe DDE on Ubuntu In the Documents folder, create a subfolder called \"dde_apps\". Download the AppImage file, change the execution permissions, and start it. DDE on Dexter In this case, we don't need to make a distributable package, we just want to run the source. And having the source directly run means we can develop on Dexter and also use parts of it in other ways (see Job Engine below). So instead of installing the Electron package, we just install the source and use npm to pull in the dependencies. Note: This requires the 16.04 version of the operating system on Dexter, and Dexter must be connected to the internet directly (not just to your PC). $ git clone https://github.com/cfry/dde\n$ cd dde\n$ npm i\n$ npm run start Note: If you find the dde won't build after the npm i command, try checking out a prior version. e.g. git checkout v3.0.7 is known to work or git checkout v3.5.2 may work for the Job Engine. Of course, the GUI part of the app will only be visible with an X-Server running and since Dexter does not have a video adapter, this must be a remote the X-Windows Desktop . On the current images, an icon is provided to launch DDE from the desktop when logged in via X-Windows. The program takes a while to load (need faster SD Card and interface?) but operation isn't horribly slow. A \"dde_apps\" folder is created under the \"/root\" folder (alongside Documents, not in it) for the DDE application. Setting the dexter0 ip address to localhost in the /root/dde_apps/dde_init.js file allows local connection of DDE to DexRun. Job Engine on Dexter To run DDE jobs without the full DDE GUI interface, e.g. via SSH , you can start them from /root/Documents/dde with the command: node core define_and_start_job job_file.dde where job_file.dde is replaced with the path and file name of the job file you want to start. Jobs can be run on Dexter automatically on startup by appending the following to the /srv/samba/share/RunDexRun script or in /etc/rc.local. The sleep 5 is required to get DexRun time to start, and sudo is required because the startup script doesn't have root access by default. cd /root/Documents/dde\nsleep 5 sudo node core define_and_start_job /srv/samba/share/autoexec.dde Job Engine Initialization: When run for the first time, the job engine creates a dde_init.js file in the /root/Documents/dde_apps folder. (note this is different than for the GUI DDE on Dexter which is in /root/dde_init.js ). If this folder doesn't exist, you will need to create it with mkdir /root/Documents/dde_apps . The job engine defaults to simulate, so the jobs don't actually make the robot move until the dde_init file is edited to add ,simulate: false after the IP address in the definition of dexter0. The IP address is set to localhost so it will work no matter what IP address Dexter is actually assigned. /root/Documents/dde_apps/dde_init.js : persistent_set ( \"ROS_URL\" , \"localhost:9090\" ) //required property, but you can edit the value. persistent_set ( \"default_dexter_ip_address\" , \"localhost\" ) //required property but you can edit the value. persistent_set ( \"default_dexter_port\" , \"50000\" ) //required property, but you can edit the value. new Dexter ( { name : \"dexter0\" , simulate : false } ) //dexter0 must be defined. When you 'run a job' as defined above, it sets window.platform to \"node\". If you are in dde, window.platform == \"dde\" will evaluate to true. That means you can customize any code written based on this \"platform\" i.e. if ( window . platform == \"node\" ) { /* hey I'm in node. */ } else if ( window . platform == \"dde\" ) { /* we're in dde! */ } The system software takes advantage of this. One important case is that the \"out\" function is defined as: function out ( val = \"\" , color = \"black\" , temp = false , code = null ) { if ( window . platform == \"node\" ) { console . log ( val ) } else { /* do formatting and print to DDE's Output pane */ } } Thus when running on node, 'out' only pays attention to its first arg, and it sends the first arg directly to the console. For more information on the Job Engine, see the dde/core/job_engine_doc.txt file Running .dde files on Dexter from DDE. A folder can be created and a systemd path unit ^ setup to send any .dde files dropped into the folder to the job engine, then delete them when finished. Then DDE's [write-to-robot] function can be used to send a .dde file to the folder. See Issue 60 Versions of DDE after 3.3.0 support running jobs on Dexter via the Jobs menu. Programming notes: Units: Note that Dexter uses the metric system of measurement. So all units of distance are in meters. A meter is about 3 feet which is about Dexters full reach at the size Dexter has been made at so far. A tenth of a meter (e.g. 0.1) is about 4 inches which is about the length of your finger. A hundredth of a meter (e.g. 0.01) called a \"centimeter\" is a about a half inch (actually closer to 0.4 inches) or about the width of your little finger. And a thousandth of a meter (e.g. 0.001) called a \"millimeter\" is tiny, about a half of a tenth of an inch or about the thickness of a fingernail. So if you change the first digit to the right of the decimal point, you are moving about a finger length. The next digit, 2nd to the right, moves you about a finger width, and the 3rd moves you about the thickness of a fingernail. Close DDE from inside DDE : require('electron').remote.getCurrentWindow().close() Debugging: Note that all of this is documented in the help system inside DDE. Download and install the program to access that in it's formatted form . the out function can be wrapped around anything to dump a copy of the result to the output panel when it is evaluated without any change in program behavior. It returns whatever it prints, so there is no side effect to it being included. E.g. let variable = out(\"Hello\" + \"World\").toUpper()) will still put \"HELLOWORLD\" in variable, but it will also let you see \"HelloWorld\" on the screen. inspect provides a very nice interactive inspector in the output panel. It does not return values like out as of this time. To debug DDE code in the Chrome debugger, launch that by right clicking anywhere in the Editor pane and select Inspect Element to open the debugger UI. Then add debugger; anywhere in the code and \"Eval\" it. You can explore variables, step, etc... everything you can do in a web page. To update / debug any part of DDE, simply overwrite the objects property in the Editor script. To retain that between restarts, add the code to the dde_init.js file in the dde_apps folder. e.g. To get a report to the output panel of the result of any call to Dexter.sleep in the job, just redefine the original function: Dexter.sleep = function(seconds){ return make_ins(\"z\", seconds) } as a new function including a call to out . e.g. Dexter.sleep = function(seconds){ return out(make_ins(\"z\", seconds)) } any job evaluated after that line will show the instruction array generated by a Dexter.sleep in the do_list. In general, you can override any function in a class with: Class . function-name = function( parameters ) { code }","filename":"DDE.md","format":"markdown","hl_body":"Dexter Development Environment DDE allows users to develop and run software on multiple platforms to control the Dexter 5 axis robot arm. In addition to providing standard robot control functions like ...","hl_title":"DDE","id":"76ceb4d3a63c22e30facaa28b7a426f609fe3a27","path":"DDE.md","public":true,"repo":{"repository":{"id":124001434,"name":"Dexter","owner_id":37091691,"owner_login":"HaddingtonDynamics","updated_at":"2022-06-08T17:18:45.529Z","has_issues":true}},"repo_id":124001434,"title":"DDE","updated_at":"2021-02-22T16:59:02.000-08:00"},{"body":"Dexter < = > DDE (or other) communications: DDE, and other applications communicate with Dexter via raw sockets, over an Ethernet link on port 50000. The DexRun firmware accepts ASCII command \"oplets\" and responds with BINARY status . Wait for status after sending each oplet: After each \"oplet\" is sent, the host application must wait for the status to be returned before sending the next oplet. Even if the status is ignored (not parsed) it is critical to wait for the status to be returned before continuing. In most cases, status will be returned almost instantly, but in some cases, it may take several seconds to process and return. Sending multiple oplets without waiting for a return status can result in unpredictable operation. Data Format Fields are separated by space (but could be comma) and the request is terminated by a ';' (semicolon). Header ​ job_id : Mapped to an actual job object. There can be many jobs and this number indexes the job the data came from. instruction id : Index of the instruction in the jobs do_list array. e.g. In a Job with 4 instructions, the id will be 4 for the last instruction. start : Time (in milliseconds since Jan 1, 1970) when the instruction was started. end : Time the instruction ended. Since the instruction hasn't ended, its end time is \"undefined.\" instruction : The command / oplet / instruction to be executed. for example, 1 2 1528438131 undefined g ; will return a status update. This is job 1, the 2nd instruction of the job, it was sent on Friday, June 8, 2018 6:08:51 AM GMT, the end time is unknown, and the oplet is 'g'. Dexter does not check or use this \"header\" information, it simply returns it to the host. All of the header data is included in response packets sent back to DDE from Dexter: The ID's and Oplet allow DDE to know what that response is to. The times are useful tools for debugging. We can know the timing of an instruction to compare it with other instructions in the job as well as instructions from other jobs. In a post-mortem analysis of two cooperating jobs, you can see which instructions (from both jobs) happened first. ​ The DexRun code is implemented in several different ways which are selected by the second command line argument. ./DexRun # 1 # uses StartServerSocket which is a generic server interface. ./DexRun # 2 # uses StartClientSocket which is a generic client interface. ./DexRun # 3 # uses StartServerSocketDDE which is a special server interface for DDE. By default, Dexter starts DexRun in this mode. StartServerSocketDDE uses a larger 256 byte buffer (the others are 64 bytes) but only 128 bytes is sent by DDE. When a new packet is received, it is processed by ProcessServerReceiveDataDDE which: Expects to see at least 4 spaces at the start (will not start passing on data until 4 spaces are seen and removed). This is done to strip off the header data and return just the actual message payload. Expects to see a 0x3B \"delimiter\" or flag at some point in the data. 0X3B is a ';' (semicolon). This is replace with a NULL and is the terminator for the payload. The code, does NOT however, stop when it sees a semicolon. ALL semicolons will be replaced with NULL. Any semicolon in the data must be escaped (e.g. as added for the write_to_robot implementation ). The ParseInput routine then tokenizes the payload input via the standard C strtok function using \" ,\" (space or comma) as the delimiter. The first token is expected to be the the command / oplet / instruction . This is converted from a letter to an enumerated value by HashInputCMD . Then a switch continues the parsing of the command according to that value. Every command sent by DDE is then replied to via ProcessServerSendDataDDE which again strtok's the (cleaned up) command from the recieved data and then simply returns it as an integer in an array along with some time information, an error code, and the current robot status . The DDE code is in socket.js. Data is sent via send, and recieved via on_recieve which is setup as the socket response handler.","filename":"DexRun-DDE-communications.md","format":"markdown","hl_body":"Dexter < = > DDE (or other) communications: DDE, and other applications communicate with Dexter via raw sockets, over an Ethernet link on port 50000. The DexRun firmware accepts ASCII command "oplets" ...","hl_title":"DexRun DDE communications","id":"4c748f5fbf0eb09dfb4396a07ec92feaa1027a35","path":"DexRun-DDE-communications.md","public":true,"repo":{"repository":{"id":124001434,"name":"Dexter","owner_id":37091691,"owner_login":"HaddingtonDynamics","updated_at":"2022-06-08T17:18:45.529Z","has_issues":true}},"repo_id":124001434,"title":"DexRun DDE communications","updated_at":"2020-09-08T11:43:54.000-07:00"},{"body":"There are two ways to connect to a ModBus device: Serial and TCP . In either case, the protocol needs to be processed via an NPM Module which can be integrated into the DDE Job Engine and which has been added to DDE for the PC as of version 3.5.7 (Note: This is a BETA version). Module If your job engine doesn't already have it, you will need to install support for ModBus protocol into Dexter. We have tested the modbus-serial NPM package. Despite the name, modbus-serial supports both serial and TCP connections. You can do this directly if Dexter is connected to the internet by SSHing into Dexter and then: cd /root/Documents/dde\nnpm install modbus-serial Note: The install will take a while. If your Dexter is NOT directly connected to your PC and does not have ModBus installed, you can try to install it locally, and then copy the files over into the node_modules folder and trigger the make in the node_modules/modbus-serial/node_modules/@serialport/bindings/build folder. This is not well documented. Hopefully you can get an updated image with the ModBus support pre-installed, or connect your Dexter to the internet for this process. Once the module is installed, you can use it via node.js. Examples are found here: https://github.com/yaacov/node-modbus-serial/tree/master/examples Job Engine Support To access the new module from DDE jobs, until support is built in, we need to update the core files SSHing into Dexter and then: cd /root/Documents/dde\nnano core/index.js Scroll down to the global. section near the end and add the line: var ModbusRTU = require(\"modbus-serial\") after the last var line above the global section, then below the other globals, add: global.ModbusRTU = ModbusRTU After this change, any of the methods allowed by the library should be available in a DDE job via the ModbusRTU object. ModBus TCP To access network modbus devices (other than you own PC), your Dexter will need to be connected to the network .\nThe following classes are supported, when working as a client: Class Client Function FC1 \"Read Coil Status\" readCoils(coil, len) FC2 \"Read Input Status\" readDiscreteInputs(addr, arg) FC3 \"Read Holding Registers\" readHoldingRegisters(addr, len) FC4 \"Read Input Registers\" readInputRegisters(addr, len) FC5 \"Force Single Coil\" writeCoil(coil, binary) //NOT setCoil FC6 \"Preset Single Register\" FC15 \"Force Multiple Coil\" writeRegister(addr, value) FC16 \"Preset Multiple Registers\" writeRegisters(addr, valueAry) FC43/14 \"Read Device Identification\" (supported ports: TCP, RTU) readDeviceIdentification(id, obj) For operation as a server, accepting requests from other modbus devices, see Issue 34 for progress on integrating a modbus server into the \"always on\" node.js web server on Dexter, and see this more extensive example from DCISIV for two way modbus communications in a job engine job. //place this in /srv/samba/share/dde_apps/modbus.dde //var ModbusRTU = require(\"modbus-serial\") //for node.js, not needed in DDE var client = new ModbusRTU ( ) ; var plc = \"192.168.0.177\" ; //change to the address of the remote device. // open connection to a tcp line client . connectTCP ( plc , { port : 8502 } ) ; client . setID ( 1 ) ; client . setTimeout ( 3000 ) ; out ( client ) client . callback = function ( err , data ) { if ( err ) { Robot . error ( err ) ; //change Robot to Control in future versions } else { console . log ( data . data ) ; } } new Job ( { user_data : { state : 1 } , name : \"modbus\" , do_list : [ function ( ) { client . writeCoil ( 5 , this . user_data . state , client . callback ) } , function ( ) { this . user_data . state = 0 } , Robot . wait_until ( 1 ) , //change Robot to Control in future versions function ( ) { client . writeCoil ( 5 , this . user_data . state , client . callback ) } , ] } ) //to run this from the terminal prompt (ssh in to Dexter), enter: //node core define_and_start_job /srv/samba/share/dde_apps/modbus.dde //Once that is working, you can add it to RunDexRun (see the bottom) or later to autoexec.jobs (if you have that) A more extensive example from DCISIV is available. A good tool for this is QModMaster which can simulate a ModBus master and allow you to send test messages. When working with ModBusTCP, it would be best for Dexter to be listening for a message all the time, and to start a job if a new message is recieved. This ability will be integrated into the onboard node web server in time. See Issue 34 for progress. ModBus Serial Of course, accessing a serial modbus device requires a serial adapter, either one with built in RS485 support 1 , or standard serial unit 1 , 2 , 3 with a TTL to RS485 adapter 1 . USB adapters based on the CP2102 or CP2104 are known to work with Dexter. See Dexter-Serial-Peripherals for installation, testing and troubleshooting of serial adapters in general. This example job connects to a serial adapter at /dev/ttyUSB0 and once the connection is established, it turns on the relay coil, reads the switch input and then turns off the relay. It uses a device address of 0 which seems to work with the standard cheap chinese modbus devices ^ . const serial_path = \"/dev/ttyUSB0\" const client_id = 0 ; const coil_no = 0 ; // create an empty modbus client var ModbusRTU = require ( \"modbus-serial\" ) ; var client = new ModbusRTU ( ) ; // open connection to a serial port, then callback write client . connectRTUBuffered ( serial_path , { baudRate : 9600 } , write ) ; //connection open, set client address and write function write ( ) { client . setID ( client_id ) ; // write the value to the coil client . writeCoil ( coil_no , 1 ) . then ( read ) //promise to read console . log ( \"write done\" ) ; return } function read ( ) { // read the register client . readHoldingRegisters ( 0 , 1 ) . then ( function ( data ) { console . log ( data ) client . writeCoil ( coil_no , 0 ) . then ( finish ) } ) ; } function finish ( ) { client . close ( ) console . log ( \"finished\" ) }","filename":"Dexter-ModBus.md","format":"markdown","hl_body":"There are two ways to connect to a ModBus device: Serial and TCP . In either case, the protocol needs to be processed via an NPM Module which can be integrated into the DDE Job Engine and which has been ...","hl_title":"Dexter ModBus","id":"8d6d5f66bd35c64c7728ab05b48dc4d12a3e7e36","path":"Dexter-ModBus.md","public":true,"repo":{"repository":{"id":124001434,"name":"Dexter","owner_id":37091691,"owner_login":"HaddingtonDynamics","updated_at":"2022-06-08T17:18:45.529Z","has_issues":true}},"repo_id":124001434,"title":"Dexter ModBus","updated_at":"2020-08-06T15:23:35.000-07:00"},{"body":"Table of contents: Connecting Dexter to the Network Finding Dexter on the Network, IP address Shell access via SSH Remote GUI interface via X-Windows Reading / Writing files Letting Dexter access the Internet See also Connection Dexter has an RJ-45 connector for CAT5 Ethernet connection. Because of issues with the Linux stack, WiFi adapters have not been supported (before Feb 2018). Those were resolved on the OS 16.04 image , and WiFi adapters DO work, but can be difficult to use. (see below) Direct to PC Although Dexter does have the ability to connect directly to the internet via a CAT5 cable to a local router, the easiest way to connect from a PC is to simply connect that CAT5 cable directly between the network port on the PC and Dexter. This is perfectly acceptable and works very well. If your computer is normally connected via WiFi, but has a CAT5 connector, this is probably the best option for you. The network adapter on the PC should be configured to the 192.168.1. network. (Since 201903, the SD card image supports both 192.168.1 and 192.168.0 networks at the same time). In the PC adapter properties for the CAT5 network adapter (not wifi), set the PC's IP address to something other than .142; e.g. set it to 192.168.1.10. set the subnet address to 255.255.255.0 set the gateway to nothing or to 192.168.1.1 For example, on Windows 10, Search for Network Status in the windows search bar - > Click change adapter options - > Right click Ethernet and go to properties. Under \"Internet Protocol version 4\" change to \"Use the following IP address\" and then enter 192.168.1.10, 255.255.255.0 and 192.168.1.1 in the three fields. For more complete instructions to configure your PC's CAT5 Network adapter, go into DDE or go to the HDRobotic.com Software page and on the Doc panel, under User Guide , Configure Dexter , Data Connection , follow the directions for your operating system. Note: You may find that the WiFi network and the Dexter network need to be on separate subnets. E.g. If WiFI is using 192.168.1. something, then try setting the CAT5 adapter for Dexter to 192.168.0.142 In most cases, for most users, this is all that is required. You can start using DDE to program your robot. For other options, continue on here... Direct to Network Router If you can connect a CAT5 cable between Dexter and your network router, Dexter will have access to NTP time, and can be reached from any PC in your internal network (assuming your router allows it). If your network is 192.168.1 or 192.168.0 this should work as long as no other device is at 192.168.x.142. You may need to change Dexters fixed IP address, or change Dexter to DHCP. (see below). If your PC is connected via CAT5, you may want to purchase a small HUB and split your network cable between Dexter and your PC. Note that Dexter is absolutely not secure, and network connections should only be made from behind a good firewall. WiFi If your SD Card is up to date, you should be able to install a WiFi adapter via the USB Host connection on the MicroZed board , and configure it for access to your WiFi router. However, Dexter is absolutely NOT secure and WiFi invites hacking. Long term use of WiFi is an invitation to finding malware on your robot arm and your WiFi password exposed. If you persist, please also note: The WiFi adapter will overheat next to the stepper drivers, so it's best to install it via a USB A extension cable. e.g. USB 3.0 A Male to A Female 6\" extension cable The USB connector is not reachable if a fan is installed directly over the stepper drivers, so that will need to be moved back. There are holes in the motor driver PCB below the terminal blocks that work well for stand-offs. You will need to connect via CAT5 or Serial USB connection then SSH in to Dexter and configure the SSID and password to match your router. Use ifconfig to verify that the WiFi adapter is working and available as a network adapter device. It should show up after the standard \"eth0\" and \"lo\" adapters with a name starting with \"w\" followed by a large hexadecimal number e.g. \"w1x74de38aef0ea\" which is based on the mac address of the adapter. (screen shot) Use nmtui from the command line and follow the prompts to connect to your WiFi. It should automatically reconnect and \"just work\". First, use the arrow keys to \"Activate a connection\" Then select the WiFi SSID A popup will ask you for the password, enter that. It should now appear with a \"*\" to the left of the SSID name, indicating it's connected. Use the right arrow and down arrow to select Quit from the program.\nUse ifconfig again to verify that there is an ip address listed under the adapter entry. That is Dexter's WiFi IP address. If you have issues, you can try sudo nmcli dev wifi connect \"ESSID_NAME\" password \"ESSID_PASSWORD\" from the command line to add a new connection to those Dexter knows. For more nmcli commands see below. Or setup Remote GUI interface via X-Windows and use the network manager. It's icon is in the bottom right (just left of the time) on Dexter's desktop. Note: sudo iwconfig wlan0 essid \" name \" key s:\" password \" does NOT support WPA authentication. Units known to work: EDIMAX EW-7811Un It does get hot and may fail just from overheating. Probably anything with the same chipset (RTL8188CUS) will work. Adafruit OURLiNK 150M . Probably anything with the RTl8192cu chipset will work. Units known to NOT work: Panda brand does NOT work. No pre-compiled driver available and no coherent documentation or source for a driver. Using nmcli to setup WiFi on Dexter. nmcli is the command line version of the network manager GUI. It can be used to set up WiFi on Dexter. nmcli dev wifi to see WiFi access points available to Dexter. nmcli dev wifi connect ESSID_NAME password ESSID_PASSWORD to add a new connection to those Dexter knows. nmcli nm to see the current status of Dexter's WiFi. nmcli c shows a list of connections known to Dexter. nmcli c delete id CONNECTION_NAME will delete the specified connection from Dexter's memory. Automatic WiFi connection by Dexter To automatically connect to a WiFI access point on startup, you can SSH into Dexter, then sudo nano /etc/network/interfaces and add the necessary information there. It should look something like auto wlan0\niface wlan0 inet static\naddress ASSIGNED_IP\nnetmask 255.255.255.0\ngateway THE_GATEWAY\nwireless-essid YOURSSID\nwireless-key WIRELESSKEY_HERE See also: https://askubuntu.com/questions/16584/how-to-connect-and-disconnect-to-a-network-manually-in-terminal IP Address Fixed IP Dexter normally defaults to 192.168.1.142 so any other address is fine for the PC adapter. (Since 201903, the SD card image answers on both 192.168.1.142 and 192.168.0.142 at the same time) The PC's wifi adapter can remain connected to local WiFi at the same time as long as it's assigned IP address is in the same subnet. To enable both WiFi and CAT5 to Dexter when the WiFi local network isn't on 192.168.1.#: First, download PuTTY or other SSH software (see below for setup and use). Make a note of the local IP address assigned to the WiFi then disconnect from WiFI, CAT5 to Dexter, SSH into Dexter or use a Serial USB connection . At the command prompt: nano /etc/network/interfaces and edit the ip address to 192.168.#.142 where the # matches the network IP address. Ctrl+X to exit, and follow the prompts to save. DHCP assigned Some Dexters may have been configured to use DHCP, and so need to be CAT5 cabled to a router with a DHCP service, or to a network with a DHCP server, and it's IP address will be whatever is assigned by DHCP. Your computer configuration needn't change. You can log into your router and look at the connected devices to find it, or Android or iOS Smartphone: Install and use the Fing app https://www.fing.io/ on Linux / Mac use arp -a . You may need to ping broadcast first. Or sudo apt-get nmap and then nmap -rP _ip_/24 where ip is your local network address. e.g. 192.168.1.1 on Windows, arp -a returns the ip address, but no machine names. The MAC address of the CAT5 adapter will always start with \"00:5D:03\" so you can do arp -a | find \"00-5d-03\" and the result is almost certainly your Dexter. Or you can download and install http://www.advanced-ip-scanner.com If you don't have a CAT5 connection to the network, you can connect directly via CAT5 to your computer, (see above) but if Dexter has been setup for DHCP, you will need to make some changes to Dexter's networking. See Issue 37 for more information. You may need to use a Serial USB connection to gain access to make those changes. To disable DHCP and return to a static IP address, connect to Dexter and at the command line, enter nano /etc/network/interfaces Then edit the file to change the iface eth0 line to replace dhcp with static . It should look like this: auto eth0\niface eth0 inet static\n address 192.168.1.142 To enable DHCP, just change the static to dhcp . It should look like this: auto eth0\niface eth0 inet dhcp\n address 192.168.1.142 The address line shouldn't cause any problems, but you can always comment it out by adding a # at the start of the line. Shell Access via SSH Once you are connected, you can shell into Dexter to update the firmware or do development in the onboard Linux OS, or just connect via DDE to develop and run jobs. On Windows prior to Windows 10, to SSH into Dexter , you will need an SSH client (e.g. PuTTY 64 bit for a 64 bit OS, or Remmina ). Configure the IP address in the client software to Dexter's IP address , set the port to 22, and select SSH. Username: root password: klg Hint: Under Connection / Data you can specify the \"Auto-login username\" so you don't have to type root every time. On Linux or Mac or from Windows 10, from the Terminal application / cmd prompt type: ssh root@192.168.1.142 (or whatever IP address Dexter is on) and when prompted for the password, enter klg . X-Windows It is also possible to run GUI applications via X11 Forwarding either from SSH on Linux or on Windows, from PuTTY via an X-Windows Server program such as X-Ming . On Linux, just SSH in but add the -X parameter, as in ssh root@192.168.1.142 -X and it will forward all X-Windows commands back to the local PC. On the MAC ssh -XCY root@192.168.1.142 In PuTTY, under Connection / SSH / X11, check \"Enable X11 forwarding\", set the display location to localhost:0.0 then save that session. Individual applications In Linux, just run any GUI application on Dexter. On Windows, you can just start XMing, then and it will start a big blank \"desktop\" window. Alt tab to see the Windows taskbar, and minimize the empty desktop (you can't close it) by right clicking the preview from the taskbar and selecting \"Minimize\". Then from Dexter and start \"nautilus\" from the command line, but use \"nautilus \" to run it in the background. Navigate to the /srv/samba/share folder to work, or to the /usr/share/applications folder to launch other applications. You can \"Bookmark\" these folders for faster access. This is kind of nice, because the applications each run in their own window in Windows making it easy to arrange them. Desktop / Command line You can also start the standard Ubuntu desktop with the command: or for a lighter desktop, try /usr/bin/startlxde or /usr/bin/lxsession -s Lubuntu -e LXDE . But from Windows, if you have multiple monitors, you may wish to configure XMing to use only one monitor. XMing comes with XLaunch which allows you to configure how XMing display things. On the first \"Display settings\" panel, select \"One window\" and then keep the defaults for the other panels. Save that configuration file and use it to launch XMing in the future. Note: On Ubuntu 12, we could do gnome-session --session=ubuntu-2d but that seems to not work on 16. In Linux, the Dexter desktop show up on the PC desktop, mixing both on the same screen. Luckily, the XDE desktop /usr/bin/startlxde uses the bottom and left corner, and the Ubuntu desktop uses the top and left side, so they co-exist pretty well. It's fun keeping track of which application is running on which device. In the Mac, the XQuartz application shows up at the top. Easy Desktop But the easiest way to set up the full desktop, after doing the above , is to use XLaunch to make a workable config file for XMing and then use that config to launch it. On the first \"Display settings\" panel, select \"One window\", on display 0. That zero is port 6000. e.g. 1 would be port 6001. If you use the \"...without titlebar\" version, you can't move the window. You can still alt tab, but if you have multiple monitors, it's nice to be able to put it elsewhere. Click \"Next\" On the \"Session type\" panel select \"Start a program\", click \"Next\" On the \"Start Program\" panel set the \"Start program\" to /usr/bin/startlxde and under \"Run Remote\" do \"Using PuTTY\" then put in the IP address of Dexter under \"Connect to computer\" and also put in root and klg as the user and pass. Click \"Next\" Leave the Clipboard and other stuff as default. Click \"Next\" On the last \"Finish\" panel, check \"Include PuTTY Password as insecure plain text\" and save the config. It will automatically start when you hit the \"Finish\" button. It does take some time to start; ~10 seconds. In the future, you can just XLaunch your configuration file. If you get a \"key exchange\" error, see this: https://www.opentechguides.com/askotg/question/106/putty-fatal-error-expected-key-exchange-group-packet-from-server Once in the desktop, you can start the file manager and navigate to the /srv/samba/share folder to edit files, or to the /usr/share/applications folder to launch other applications. This works a bit faster than the standard Dash home. If you \"Browse Network\" you may be able to access local NAS or other Linux shares, but Windows shared folders probably won't appear. The default background logo really slows things down, but you can get rid of it under System Settings / Appearance. A solid black color seems fastest. Terminal is very nice looking, with colors, a clear font, and nice size. It's even nicer if you go into Edit / Profile Preferences and uncheck \"Use the system fixed width font\". File Sharing SAMBA Dexter provides a SAMBA share and an sFTP service for transferring files back and forth, in addition to the socket connection for commands via DexRun. Access the share at \\\\ dexters-ip \\share . Some versions of Windows or some Firewalls may block access to this share. Apparently this is because it isn't password protected. See Issue #58 for issues with Windows 8 / 10. SFTP You can also transfer files via the /usr/lib/openssh/sftp-server service but you will need to supply the same username and password. On Windows you will need a client which supports sftp such as https://winscp.net/eng/download.php Or if you want to integrate SFTP support into the Windows Explorer, you might try: http://www.swish-sftp.org Once installed, just go to \"Swish\" in the address bar and \"Add SFTP Connection\". The Remmina SSH client (only available on Linux) includes a file transfer function. Be sure to select SFTP as the protocol and change the port to 22. On the MAC you can use Cyberduck. Click on \"Open Connection\" then change \"FTP..\" to \"SFTP...\" and enter the ip address of in the \"Server\" field. Username \"root\" and password \"klg\". The port must be set to 22. If you wish to disable or reconfigure the sftp daemon, see the /etc/ssh folder. Note: SFTP is not at all related to FTP. SCP If you are using Linux or MAC, you can transfer files via the terminal window using the SCP command. For example, if you cd into the folder on your computer where the file you want to transfer is located, you can enter a command like: scp -3 RunDexRun root@192.168.1.142:/srv/samba/share where \"RunDexRn\" is the file being transferred, \"192.168.1.142\" is the IP address of the Dexter, and \"/srv/samba/share\" is the destination address. Internet access You generally should NOT need to actually give Dexter access to the internet, but if you need that for some reason, you will need that CAT5 cable to run between Dexter and your Router. After a restart, Dexter may automatically connect and have internet access, if the network is 192.168.0.x and your gateway is 192.168.0.1. You can test that from your command prompt with ping 192.168.0.142 or ping and whatever Dexters IP address is (press Ctrl+C to stop). If it works, SSH into Dexter and try ping www.google.com from Dexter. If that works, great! If not, here are some common errors and how to resolve them. WARNING: If you change Dexters network setup, you may lose the ability to connect to Dexter from your PC. It might be best to setup the USB connection FIRST as that will work in any case. The directions below assume you are connected to Dexter via USB. \"...unreachable\" There is no internet connection. Check that Dexter is configured and on the same network as your router. E.g. If your local network is 172.16.x.x or 10.x.x.x or 192.168.1.x you will need to edit the IP address in both Dexter and DDE to match, giving Dexter an unused IP in the range, and setting the gateway correctly for your network.\nIn DDE, you will need to change the default address for your Dexter robot in the dde_init.js file in your documents dde_apps folder. e.g. persistent_set(\"default_dexter_ip_address\", \"192.168.1.142\") but using whatever Dexters IP address happens to be. Use the USB connection to access Dexters command shell, then sudo nano /etc/network/interfaces to edit the \"address\" line there to match. You will also need to make sure the correct gateway and nameservers are set. A typical setup looks like this: (other lines in the file should be commented out with a #) auto eth0\niface eth0 inet static\n address 192.168.1.142\n #set Dexters fixed IP address here\n netmask 255.255.255.0\n gateway 192.168.1.1\n #set your gateway address (router)\n dns-nameservers 192.168.1.1 8.8.8.8\n #set your local DNS server and/or 8.8.8.8 to use google \"Unknown host\" The DNS system could not resolve the name to an IP address. Try ping 8.8.8.8 instead. If you CAN ping 8.8.8.8 but still have no DNS (e.g. ping www.google.com ) fails, then try adding nameserver 8.8.8.8 to a file called /etc/resolvconf/resolv.conf.d/base\ne.g. sudo nano /etc/resolvconf/resolv.conf.d/base type in nameserver 8.8.8.8 save it, and then restart. The ethernet adapter on the Xilinx chips all come with the same MAC address and IP address. If there is more than one Dexter on the CAT5 network (doesn't apply to WiFi) you will need to edit both. See Issue 57 for more information. IP address crashes: If you have multiple Dexters on the same IP address, or if there happens to be some other device on the network with the same IP address, you will not be able to reliably communicate with Dexter. On a large network, or one that uses DHCP over all addresses, you should probably convert to using DHCP . See the DHCP section for information on how to set that up, and how to find Dexters IP address when it's being assigned by a DHCP service. See also https://help.ubuntu.com/lts/serverguide/network-configuration.html General information on Network configuration for servers. Dexter is basically a server. https://askubuntu.com/questions/971171/how-to-use-putty-to-get-x11-connections-over-ssh-from-windows-to-ubuntu Setting up X Windows on Windows via PuTTY. http://www.straightrunning.com/XmingNotes/ XMing home page.","filename":"Dexter-Networking.md","format":"markdown","hl_body":"Table of contents: Connecting Dexter to the Network Finding Dexter on the Network, IP address Shell access via SSH Remote GUI interface via X-Windows Reading / Writing files Letting Dexter access the Internet ...","hl_title":"Dexter Networking","id":"0b0a10c1d852d6c9c3cbb21dd796d32be4b88548","path":"Dexter-Networking.md","public":true,"repo":{"repository":{"id":124001434,"name":"Dexter","owner_id":37091691,"owner_login":"HaddingtonDynamics","updated_at":"2022-06-08T17:18:45.529Z","has_issues":true}},"repo_id":124001434,"title":"Dexter Networking","updated_at":"2021-05-19T09:24:06.000-07:00"},{"body":"In most cases, you will control Dexter and other robots, or peripheral including serial devices from DDE on a PC. That allows you to bring the power of the PC and the DDE IDE to bear on the overall control problem. However, in some cases you might want to connect something directly to Dexter and run a job via the Job Engine, which is DDE running on Dexter vs DDE running on the PC. Serial devices, such as TTL serial adapters, ModBus adapters, or other devices with a serial interface like the OpenMV camera can be connected to Dexter's USB A connector, found just under the CAT5 connector on the MicroZed board. To verify the connection, you will need to SSH in or connect via the USB console cable. Once you are at the command prompt on Dexter, with the device disconnected type the following commands (bolded in the sample session below): ls /dev/co* /dev/console ls /dev/tty* Now, plug in the device and wait a few moments, then enter those same commands again. In this case, I've plugged in a simple USB - TTL adapter based on the CP2102 chip. Look for the difference: ls /dev/co* /dev/console ls /dev/ttyUSB* /dev/ttyUSB0 As you can see, the new device is there at /dev/ttyUSB0 . Arduino Unos may show up as /dev/ttyACM0 . The OpenMV camera will also show up as /dev/ttyACM# Note: To find and mount the flash drive to program the OpenMV cam, you can use blkid to show available block devices without the device connected, then connect it and use the command again. The new device is the camera. It will probably appear as /dev/sda1: SEC_TYPE=\"msdos\" UUID=\"4621-0000\" TYPE=\"vfat\" . To access the contents, make a folder: mkdir /mnt/openmvcam then mount the device: sudo mount /dev/sda1 /mnt/openmvcam/ and the files will appear at /mnt/openmvcam . Edit main.py to change the cameras code. When finished, be sure to umount /mnt/openmvcam To test it's operation, you can even use the command line to send and receive data. e.g. Here is a sample session for an Arduino device programmed to respond with some binary data and a few analog port readings in response to a \"?\". You can find the code for that here: https://gist.github.com/JamesNewton/8b994528ff3ce69e60bbb67c40954cd2 stty -echo -F /dev/ttyUSB0 ospeed 57600 ispeed 57600 raw\necho -ne '?' /dev/ttyUSB0\ncat -v /dev/ttyUSB0 In that session, the following showed up at the console: 10000000000000,470,419,423,389,362,343 ^M which is exactly what the device was programmed to return. Note that the -v after the cat causes control characters from the device to be displayed. For example, the carriage return is shown as ^M and the end of the returned string. You can omit the -v if you don't want to see those. The -echo in the setup of the port turns off automatic echoing of all recieved characters. If you omit this, you may find that the device also receives the data that it sends to you. (Note, if you are working on a Linux PC, where you do not have root permissions, you may need to: sudo usermod -a -G dialout $USER in order to become part of the dialout group, which is required for access to tty devices. ) You can have a two way conversation via typing in data and seeing the result via: stty -echo -F /dev/ttyUSB0 ospeed 57600 ispeed 57600 raw\ncat -v /dev/ttyUSB0 cat /dev/ttyUSB0 Press Ctrl+C to exit the cat from the console to the device, then enter fg 1 and Ctrl+C to exit the cat from the device to the console, which is running in the background, because of the . jobs should not show anything running. Next, we want to use the \"serial\" functions in the \"job engine\"; DDE on Dexter) but there have been issues which require a little hacking depending on the version you have: https://github.com/HaddingtonDynamics/Dexter/issues/60#issuecomment-605376411","filename":"Dexter-Serial-Peripherals.md","format":"markdown","hl_body":"In most cases, you will control Dexter and other robots, or peripheral including serial devices from DDE on a PC. That allows you to bring the power of the PC and the DDE IDE to bear on the overall control ...","hl_title":"Dexter Serial Peripherals","id":"2b95bfdea908c373ed6891a54834058a9577a1b1","path":"Dexter-Serial-Peripherals.md","public":true,"repo":{"repository":{"id":124001434,"name":"Dexter","owner_id":37091691,"owner_login":"HaddingtonDynamics","updated_at":"2022-06-08T17:18:45.529Z","has_issues":true}},"repo_id":124001434,"title":"Dexter Serial Peripherals","updated_at":"2020-10-06T11:23:16.000-07:00"},{"body":"Unpack Caution: When following the directions below to remove a Dexter from its shipping / storage case, please be very careful to rotate each joint in the correct direction to unfold the arm and stand it up straight. This direction should be obvious for the base (joint1) and joints 2 and 3, but joints 4 and 5 can be rotated in the wrong direction and end up 360 degrees from the correct place. Pictures placed in the case when a new Dexter is sent out should indicate the correct directions, but you can also figure them out by looking at what the tool interface will run into as it's rotated. Just make sure the wires don't get wrapped up. Normally, all that is required is rotating Joint 3, \"the elbow\" up to a straight vertical position. Mount The top layer of the case will contain the base, remove it and place it with the feet down, and the center mounting pole up. The standard Dexter base is NOT intended to be perfectly stable. It must be mounted to a stable surface by gluing, screwing, or clamping the legs down. If the surface has a lip, you can clamp 2 or 3 of the feet down. Check that the lower part of the arm body will clear the tops of the clamps. For wooden, metal, or other surfaces which can have holes, screw or bolt the feet down. For a flat, inviolate surface like steel, marble, cement, etc... use large amounts of hot glue injected up into the bottom of each \"foot\" Other options are available for customization, please contact us. Assemble Now remove the Dexter robot from the lower level of the case. This picture shows a Dexter with a skin, your's may not have one. Typically, you should grip it by the handle on Joint 3 aka \"the elbow\" (avoid gripping the side of joint 3 which has the belts) and by the base mounting column. Align the strakes with holes in the base mount and slide it in. Tighten the base clamp. It requires a Phillips head screwdriver. Position Before powering on Dexter, position each joint at the home position. This is less important for the Dexter HDI models as it will find it's own home position when powered up, however, it's faster if it's already closer to home. Prior models will need to be placed as close to home position as is possible using the knobs on the motors. The default position is with all the joints vertical, and the tool interface (the last segment) pointed to the right when facing the joints, as shown here: On the Dexter HDI, there is a mark on the base that indicates the home position. The robot should be rotated until the mark is close to the J1 Opto block, as shown here: This easily visible alignment will place the \"X\" on the base mount directly behind the main arm body (where it is hard to see). Normally, when unpacking Dexter, all you should need to do is rotate Joint 3 in the direction shown by the arrow (clockwise, when facing the motors) and make minor adjustments to the other joints. Each motor drive shaft has a small dial / handle which can be used to rotate it to a consistent position on startup. The exception is Joint 1, which can be aligned by simply rotating it. Wherever the robot is located when powered on is accepted as the zero or home position. For more on this, see Encoder Calibration . DDE will walk you through initial calibration. Note: The Dexter HDI should NEVER be calibrated outside the factory as it is not necessary and is a complex process. Power Before powering up your Dexter, make sure the SD card is in place (powering on a microZed without an SD card will destroy it) and that no wires have come loose. If your Dexter is skinned, this shouldn't be an issue. Plug in the power cord to fire up your Dexter robot. You should see a blue light on the control board. Wait for the \"boot dance\" to complete (if it's enabled). If you don't see the boot dance, or the board doesn't light up, see Troubleshooting Connect If the robot appears to be working ok, continue to connect to Dexter . In general, you want to connect Dexters CAT 5 cable to the network port adapter on your PC or laptop and configure your settings for that Adapter to have a fixed IP address of 192.168.1.10 and no gateway. Then you should be able to ping Dexter at 192.168.1.142. If you have issues, see Dexter Networking Bootup On power up, Dexter will load the OS, then move slightly to let you know it's working. That's it for the Dexter 1 and HD models. On the new HDI, the robot will take a minute or two. If so configured, it may then go into PHUI mode where it is waiting for you to move the end effector and record or play back recordings. While in any of these startup modes, you will NOT be able to communicate with the robot via DDE . You can use web interface if installed, or SSH or the console cable . Once those startup modes end, you will be able to communicate with the robot via DDE. To change the startup jobs, edit, via the web editor or nano in SSH , the autoexec.jobs file, or if it is not present (older robot) then edit the end of the RunDexRun file. To exit PHUI mode once it is running: Grab the tool interface and \"cog\" up twice to exit PUI mode. After exiting, Dexter firmware will respond to commands from a PC or other connected device. https://youtu.be/A261tEkue2M","filename":"Dexter-Setup.md","format":"markdown","hl_body":"Unpack Caution: When following the directions below to remove a Dexter from its shipping / storage case, please be very careful to rotate each joint in the correct direction to unfold the arm and stand ...","hl_title":"Dexter Setup","id":"a47e08cd358a7a917b6f11c0449d96bce12968be","path":"Dexter-Setup.md","public":true,"repo":{"repository":{"id":124001434,"name":"Dexter","owner_id":37091691,"owner_login":"HaddingtonDynamics","updated_at":"2022-06-08T17:18:45.529Z","has_issues":true}},"repo_id":124001434,"title":"Dexter Setup","updated_at":"2022-07-08T16:35:52.000-04:00"},{"body":"Note: This is about the USB Micro B port on Dexter that makes it a peripheral, and NOT about the USB A port which allows Dexter to be a USB HOST for other peripherals such as serial adapters , modbus devices , web cams , audio adapters , etc... The MicroZed processor board on Dexter has as Micro B USB connector at the bottom of the board, left of the CAT5 and USB A connector, directly in front of the SDCard slot, which provides a serial connection to a PC via a SiLabs CP2104 adapter.\n(\"SiLabs\" stands for \"Silicon Labs\", a manufacturer)\nTo use it connect a USB A to USB Micro B cable between the PC and Dexter. Note: Make sure it's not a cell phone charging cable and is in fact a data cable. When you plug it in, the computer should react. Then install the CP2104 device driver, find the COM port number and use a terminal program like screen or PuTTY to log in. Details below. Picture of USB A to USB Micro B cable Note: As soon as you connect a USB cable between your PC and the MicroZed, it will be powered up and start booting. If Dexters power brick isn't plugged in, the motors, etc... will not be able to move and the software may be quite confused. Always power up Dexter first, THEN connect the USB cable. If you need to see the boot messages (to troubleshoot problems) use the Reset button (marked \"SW2\", next to the Blue LED, left side when Dexter is upright) on the MicroZed Board to restart. Once the cable is connected, the driver should automatically be installed. It is commonly available and should be automatic on Windows, Mac, and most Linux distributions. Installing the CP2104 USB adapter driver on Windows If your computer doesn't find the driver, you can download it from https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers CP2104 USB Port Installed Once the driver is installed, click Start and enter devmgmt.msc, press enter. you should see it under Ports, as COM# where # is some number. E.g. COM63 in this case. On Linux or Mac, from Terminal, ls /dev/tty* and then plug in the cable, wait a bit and repeat. Whatever showed up new is the correct port. Linux via 'screen' On a Linux (or mac?), from Terminal, the command line: screen /dev/ttyUSB0 115200 will get you a connection, where ttyUSB0 is whatever port showed up when you plugged in. If you don't have \"screen\" you should be able to install it with sudo apt-get install screen Note: To exit screen, press Ctrl+a then type :quit and press enter. PuTTY In PuTTY , on the \"Session\" screen, select \"Serial\". Enter the port name (e.g. \"COM\" and the number as shown in the ports list. In the above image, this is the\nvalue of the comName field, i.e. \"COM63\".) change the \"Speed\" to 115200. You can enter and name for this setting and save it here as well. Under \"Connection\" on the \"Serial\" screen, make sure the \"Data bits\", \"Stop bits\" and \"Parity\" are 8, 1 and None. Press \"Open\" and the connection should be made. You may not see any text, just press enter to get a prompt. In DDE Eval result of serial_devices() before installing: INSPECTing A Array of 0 (Here an empty array indicates that there are no serial port devices. But more definitively,\nthere are no Silicon Labs devices so no Dexter's connected.) Eval result of serial_devices() after installing: Refresh INSPECTing An Object of 7 properties\n{comName: \"COM63\"\n locationId: \"Port_#0001.Hub_#0006\"\n manufacturer: \"Silicon Labs\"\n pnpId: \"USB\\\\VID_10C4 PID_EA60\\\\01255890\"\n productId: \"EA60\"\n serialNumber: \"01255890\"\n vendorId: \"10C4\"\n}\nAbove we are inspecting the first element of the array returned by serial_devices.\nSince it has a manufacturer of \"Silicon Labs\", we conclude that this is a Dexter.","filename":"Dexter-USB-Connection.md","format":"markdown","hl_body":"Note: This is about the USB Micro B port on Dexter that makes it a peripheral, and NOT about the USB A port which allows Dexter to be a USB HOST for other peripherals such as serial adapters , modbus devices ...","hl_title":"Dexter USB Connection","id":"c6ddaa0111d89acac58de3a60e6c674220acc8cf","path":"Dexter-USB-Connection.md","public":true,"repo":{"repository":{"id":124001434,"name":"Dexter","owner_id":37091691,"owner_login":"HaddingtonDynamics","updated_at":"2022-06-08T17:18:45.529Z","has_issues":true}},"repo_id":124001434,"title":"Dexter USB Connection","updated_at":"2022-05-03T16:19:09.000-07:00"},{"body":"Note: The HDI version of the differential is a significant improvement over the HD version shown here. The HD version of the Differential Joint can be used on prior Dexter versions, and offers several advantages. The largest advantage is that the encoder disks fully encircle the joint, fused to the parts, and so are far more mechanically stable. Thanks to Lam Ching Ho for these pictures. You can view it in 3D on tinkercad The STL files for printing are available: https://www.thingiverse.com/thing:3206154 But it should be noted that they are typically printed in the Onyx Carbon Fiber filament on a Markforged 3D printer. Other filaments should work, but won't be as strong. ABS is probably the best choice for commonly available materials. The part files are: DiffGearAxle AnglePhoto DiffBodyA DiffBodyB DiffEndPulley DiffGearShaftXL RotateCodeDisk RotatePhotoA RotatePhotoB SplitGearBottom SplitGearTop","filename":"Differential-Joint.md","format":"markdown","hl_body":"Note: The HDI version of the differential is a significant improvement over the HD version shown here. The HD version of the Differential Joint can be used on prior Dexter versions, and offers several ...","hl_title":"Differential Joint","id":"a0db93e8913d8316ed49f57b36b53aadf4e5de46","path":"Differential-Joint.md","public":true,"repo":{"repository":{"id":124001434,"name":"Dexter","owner_id":37091691,"owner_login":"HaddingtonDynamics","updated_at":"2022-06-08T17:18:45.529Z","has_issues":true}},"repo_id":124001434,"title":"Differential Joint","updated_at":"2020-08-26T14:53:56.000-07:00"},{"body":"Not much work has been done in terms of dynamics but some statics have been done... Center of Mass Measurements The center of mass (CoM) has been measured for a Dexter HDI and the results are shown below. It should be noted that this particular Dexter may not match every Dexter.\nA couple of features specific to the Dexter HDI that was measured: -Double base clamp (affects the link lengths and overall height of every z measurements) -Bolted base instead of 6 legged aluminum strake base -End-Effector is not included","filename":"Dynamics.md","format":"markdown","hl_body":"Not much work has been done in terms of dynamics but some statics have been done... Center of Mass Measurements The center of mass (CoM) has been measured for a Dexter HDI and the results are shown below. ...","hl_title":"Dynamics","id":"044b0023591591bd5b756076ee6516ba3e14b625","path":"Dynamics.md","public":true,"repo":{"repository":{"id":124001434,"name":"Dexter","owner_id":37091691,"owner_login":"HaddingtonDynamics","updated_at":"2022-06-08T17:18:45.529Z","has_issues":true}},"repo_id":124001434,"title":"Dynamics","updated_at":"2020-08-26T15:07:40.000-07:00"}],"type":"wikis","page":1,"page_count":4,"elapsed_millis":156,"errors":[],"result_count":37,"facets":[],"protected_org_logins":[],"topics":null,"query_id":"","logged_in":false,"sign_up_path":"/signup?source=code_search_results","sign_in_path":"/login?return_to=https%3A%2F%2Fgithub.com%2Fsearch%3Fq%3Drepo%253AHaddingtonDynamics%252FDexter%2B%26type%3DWikis","metadata":null},"title":"Wiki search results"}