Hola a todos,
He estado una semana siguiendo tutoriales que prometían mejorar el rendimiento de mi ubuntu instalado en VirtualBox sin éxito.
He aquí la solución:
Mira primero si tienes habilitado el unity 3D (lo más seguro es que no). Para ello teclea en el terminal:
sudo /usr/lib/nux/unity_support_test -p
Mira la última línea y si es que no, es que no.
Cierra la máquina virtual y te vas al administrador de Oracle VirtualBox (la ventana que te queda abierta una vez cierras la de ubuntu).
Te vas a pantalla y allí pones la memoria de vídeo al máximo (128MB en mi caso) y habilitas la aceleración 3D.
Abres ubuntu de nuevo y vuelves a teclear en la terminal esto:
sudo /usr/lib/nux/unity_support_test -p
Te debería aparecer algo así:
Not software rendered: yes
Not blacklisted: yes
GLX fbconfig: yes
GLX texture from pixmap: yes
GL npot or rect textures: yes
GL vertex program: yes
GL fragment program: yes
GL vertex buffer object: yes
GL framebuffer object: yes
GL version is 1.4+: yes
Unity 3D supported: yes
Espero que le sirva a alguien más. Con lo fácil que era y ¡lo que me ha costado!
Saludos.
viernes, 5 de septiembre de 2014
viernes, 6 de junio de 2014
Mover dos motores paso a paso con Matlab y Arduino por el puerto serie
Como me ha costado bastante comunicarme por el puerto serie desde Matlab a Arduino UNO y viceversa, lo comparto por si a alguien más le sirve.
La idea es configurar mi Arduino para que mueva dos motores paso a paso. Estos motores llevan además una tarjeta EasyDriver para controlar la etapa de potencia. Los motores en mi caso están conectados a dos rotadores, que llevan un limit switch cada uno para chequear el paso por 0º en cada vuelta. Un tornillo fijo pisará ese limit switch cada vez que pase por 0º.
Ya sabéis, primero cargáis el sketch de Arduino y lo compiláis. Después, solo tenéis que ejecutar el script de Matlab.
La idea es configurar mi Arduino para que mueva dos motores paso a paso. Estos motores llevan además una tarjeta EasyDriver para controlar la etapa de potencia. Los motores en mi caso están conectados a dos rotadores, que llevan un limit switch cada uno para chequear el paso por 0º en cada vuelta. Un tornillo fijo pisará ese limit switch cada vez que pase por 0º.
DC 5V Deceleration Stepper Motor Module
EasyDriver V4.4 Stepper Motor Driver Board for Arduino (Works with Official Arduino Boards)
La función de Matlab es arduino(motor, pasos, reset).
motor: puede ser 1 o 2, en función del motor que queramos mover
pasos: número de pasos que queremos avanzar.
reset: puede ser 0 o 1.
Si reset está a 1, movemos el motor que le hayamos indicado hasta que toque el limit switch.
Si reset está a 0, movemos el motor los pasos que le hemos indicado.
%Funciona con motor_matlab.ino
function arduino(motor, pasos, reset)
ports=instrfind();
if ~isempty(ports)
fclose(ports);
end
s = serial('COM4');
set(s,'Baudrate',9600); % se configura la velocidad a 9600 Baudios
set(s,'StopBits',1); % se configura bit de parada a uno
set(s,'DataBits',8); % se configura que el dato es de 8 bits, debe estar entre 5 y 8
set(s,'Parity','none'); % se configura sin paridad
set(s,'Terminator','CR/LF');% ìcî caracter con que finaliza el envÌo
flushoutput(s); % Limpiamos el buffer
flushinput(s); % Limpiamos el buffer
fopen(s);
pasos_aux=dec2bin(pasos,16);
pasos_hi=bin2dec(pasos_aux(1:8));
pasos_lo=bin2dec(pasos_aux(9:16));
mat=[motor pasos_hi pasos_lo reset];
c=fscanf(s); % Limpio el buffer
fwrite(s, mat, 'uint8', 'sync');
pasos_2 = fscanf(s,'%s');
LS1='0';
LS2='0';
i=1;
if reset==0
while i<=pasos
LS1 = fscanf(s,'%s');
LS2 = fscanf(s,'%s');
cont= fscanf(s,'%s');
str= [LS1 ' ' LS2 ' ' cont];
disp(str);
i=i+1;
end
elseif motor==1
while LS1=='0'
LS1 = fscanf(s,'%s');
LS2 = fscanf(s,'%s');
cont= fscanf(s,'%s');
str= [LS1 ' ' LS2 ' ' cont];
disp(str);
i=i+1;
end
elseif motor==2
while LS2=='0'
LS1 = fscanf(s,'%s');
LS2 = fscanf(s,'%s');
cont= fscanf(s,'%s');
str= [LS1 ' ' LS2 ' ' cont];
disp(str);
i=i+1;
end
end
fclose(s);
y el sketch en Arduino es este:
//---------------------------------------------------------------------
// motor_matlab.ino
//---------------------------------------------------------------------
//Sketch de arduino 1 para mover el motor 1 o el 2 los pasos que se le
// indiquen o bien resetear el motor indicado
//---------------------------------------------------------------------
// Inicialización de pines
int dirpin1 = 3; // Motor 1: dirección y pasos
int steppin1 = 2;
int dirpin2 = 5; // Motor 2: dirección y pasos
int steppin2 = 4;
//limit switch
int PW01 = 11;
int PW02 = 12;
int PW1 = 8;
int PW2 = 9;
int SW1 = 10;
int SW2 = 13;
// Variables:
int motor = 0;
int motor_s = 0;
int pasos_hi = 0;
int pasos_lo = 0;
int pasos;
int reset = 0;
int reset_s = 0;
int buttonState1=0;
int buttonState2=0;
int contador=0;
int i=0;
String myStr_hi;
String myStr_lo;
String myStr;
String motor_str;
String reset_str;
void setup()
{
Serial.begin(9600);
//PaP
pinMode(dirpin1, OUTPUT);
pinMode(steppin1, OUTPUT);
pinMode(dirpin2, OUTPUT);
pinMode(steppin2, OUTPUT);
//limit switch
pinMode(PW1, OUTPUT);
pinMode(PW2, OUTPUT);
pinMode(PW01, OUTPUT);
pinMode(PW02, OUTPUT);
pinMode(SW1, INPUT);
pinMode(SW2, INPUT);
digitalWrite(PW1, HIGH); // Tienen que estar a 5V
digitalWrite(PW2, HIGH);
digitalWrite(PW01, LOW); // Tienen que estar a 0V
digitalWrite(PW02, LOW);
digitalWrite(dirpin1, HIGH); // Dirección del PaP
delay(100);
digitalWrite(dirpin2, HIGH); // Dirección del PaP
delay(100);
}
void loop()
{
if (Serial.available() > 0)
{
// lee los 4 bytes entrantes: [motor pasos_hi pasos_lo reset]
motor = Serial.read();
delay(100);
pasos_hi = Serial.read();
delay(100);
pasos_lo = Serial.read();
delay(100);
reset = Serial.read();
delay(100);
Serial.flush();
delay(1);
// Paso los bytes de decimal a binario
myStr_hi = dec2bin8(pasos_hi);
myStr_lo = dec2bin8(pasos_lo);
// Concateno el byte superior con el inferior
myStr = myStr_hi + myStr_lo;
// paso la cadena de binario a decimal
pasos=bin2dec(myStr,16);
Serial.println(pasos, DEC);
if (motor==1)
{
if (reset==1){
do {
digitalWrite(steppin1, LOW); // Inicia el PaP
digitalWrite(steppin1, HIGH);
delayMicroseconds(200);
buttonState1 = digitalRead(SW1); // Mira el limit switch 1
delay(1);
buttonState2 = digitalRead(SW2); // Mira el limit switch 2
delay(1);
i++;
Serial.println(buttonState1);
delay(1);
Serial.println(buttonState2);
delay(1);
Serial.println(i);
}
while (buttonState1 == 0);
}
else{
do{
digitalWrite(steppin1, LOW);
digitalWrite(steppin1, HIGH);
delayMicroseconds(200);
buttonState1 = digitalRead(SW1);
delay(1);
buttonState2 = digitalRead(SW2);
delay(1);
i++;
Serial.println(buttonState1);
delay(1);
Serial.println(buttonState2);
delay(1);
Serial.println(i);
}while (i<pasos);
}
}
else
{
if (reset==1){
do {
digitalWrite(steppin2, LOW);
digitalWrite(steppin2, HIGH);
delayMicroseconds(200);
buttonState1 = digitalRead(SW1);
delay(1);
buttonState2 = digitalRead(SW2);
delay(1);
i++;
Serial.println(buttonState1);
delay(1);
Serial.println(buttonState2);
delay(1);
Serial.println(i);
}while (buttonState2 == 0);
}
else{
do{
digitalWrite(steppin2, LOW);
digitalWrite(steppin2, HIGH);
delayMicroseconds(200);
buttonState1 = digitalRead(SW1);
delay(1);
buttonState2 = digitalRead(SW2);
delay(1);
i++;
Serial.println(buttonState1);
delay(1);
Serial.println(buttonState2);
delay(1);
Serial.println(i);
}while (i<pasos);
}
}
}
}
// Para pasar de decimal a binario de 8 bits en arduino uno
String dec2bin8(int myNum)
{
int zeros = 8 - String(myNum,BIN).length();
String myStr;
for (int i=0; i<zeros; i++) {
myStr = myStr + "0";
}
myStr = myStr + String(myNum,BIN);
delay(1000);
return myStr;
}
// Para pasar de binario a decimal
int bin2dec(String orig, int tam){
int result = 0;
for (int i=0;i<tam;i++){
result = result*2;
result += (orig[i]-48);
//Serial.println(i);
//Serial.println(result);
}
return result;
}
Ya sabéis, primero cargáis el sketch de Arduino y lo compiláis. Después, solo tenéis que ejecutar el script de Matlab.
Y nada más, espero que os sirva para jugar con vuestros arduinos.
¡Hasta otra!
jueves, 17 de enero de 2013
Matlab SOAP Client
Un SOAP client en Matlab que funciona. Encontré este código en internet y lo he tenido que tocar un poquito hasta que por fin ha funcionado y conecto perfectamente con un servidor SOAP. He sudado sangre hasta que ha funcionado, espero que os sirva y que no tengáis que sudar vosotros también.
Saludos!
function [IN OUT]=SOAPClient()
%-------------------------------------------------------------
import java.io.*;
import java.net.*;
import com.mathworks.mlwidgets.io.InterruptibleStreamCopier;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
%-------------------------------------------------------------
IN='';
OUT='';
endpoint='https://www.miendpoint.com?wdsl';
soapAction='mySOAPAction';
url = URL([],endpoint, sun.net.www.protocol.https.Handler);
com.mathworks.mlwidgets.html.HTMLPrefs.setProxySettings
mwtcp = com.mathworks.net.transport.MWTransportClientPropertiesFactory.create();
proxy = mwtcp.getProxy();
if isempty(proxy)
httpConn = url.openConnection;
else
httpConn = url.openConnection(proxy);
end
httpConn.setRequestProperty('Content-Type','text/xml; charset=utf-8');
httpConn.setRequestMethod('POST');
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
% Aquí le pasas la petición al servidor en formato XML
message=xmlread('SOAP_Request.xml');
toSend = serializeDOM(message);
toSend = java.lang.String(toSend);
b = toSend.getBytes('UTF8');
IN=char(b');
try
outputStream = httpConn.getOutputStream;
outputStream.write(b);
outputStream.close;
disp('Mensaje enviado')
catch e
exception = regexp(e.message, ...
'Java exception occurred: \n(.*?)\s*\n','tokens','once');
if ~isempty(exception)
exception = exception{1};
if strcmp(exception, ...
'java.net.ConnectException: Connection refused: connect')
error('MATLAB:callSoapService:ConnectionRefused','Connection refused.');
end
if strcmp(exception, ...
'ice.net.URLNotFoundException: Document not found on server')
error('MATLAB:callSoapService:UrlNotFoundOnServer','The requested URL was not found on this server.')
end
host = regexp(exception,'java.net.UnknownHostException: (.*)','tokens','once');
if ~isempty(host)
error('MATLAB:callSoapService:UnknownHost','Unknown host: %s',host{1})
end
error('MATLAB:callSoapService:Exception',exception)
else
rethrow(e)
end
end
try
disp('Recibiendo mensaje...');
inputStream = httpConn.getInputStream;
disp('Mensaje recibido!!')
byteArrayOutputStream = java.io.ByteArrayOutputStream;
isc = InterruptibleStreamCopier.getInterruptibleStreamCopier;
isc.copyStream(inputStream,byteArrayOutputStream);
inputStream.close;
byteArrayOutputStream.close;
OUT=byteArrayOutputStream;
message = e.message;
t = regexp(message,'java.io.IOException: (.*?)\n','tokens','once');
if ~isempty(t)
message = t{1};
end
%================================================================
function s = serializeDOM(x)
domSource = javax.xml.transform.dom.DOMSource(x);
tf = javax.xml.transform.TransformerFactory.newInstance;
serializer = tf.newTransformer;
serializer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING,'utf-8');
serializer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT,'yes');
stringWriter = java.io.StringWriter;
streamResult = javax.xml.transform.stream.StreamResult(stringWriter);
serializer.transform(domSource, streamResult);
s = char(stringWriter.toString);
Saludos!
function [IN OUT]=SOAPClient()
%-------------------------------------------------------------
import java.io.*;
import java.net.*;
import com.mathworks.mlwidgets.io.InterruptibleStreamCopier;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
%-------------------------------------------------------------
IN='';
OUT='';
endpoint='https://www.miendpoint.com?wdsl';
soapAction='mySOAPAction';
url = URL([],endpoint, sun.net.www.protocol.https.Handler);
com.mathworks.mlwidgets.html.HTMLPrefs.setProxySettings
mwtcp = com.mathworks.net.transport.MWTransportClientPropertiesFactory.create();
proxy = mwtcp.getProxy();
if isempty(proxy)
httpConn = url.openConnection;
else
httpConn = url.openConnection(proxy);
end
httpConn.setRequestProperty('Content-Type','text/xml; charset=utf-8');
httpConn.setRequestMethod('POST');
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
% Aquí le pasas la petición al servidor en formato XML
message=xmlread('SOAP_Request.xml');
toSend = serializeDOM(message);
toSend = java.lang.String(toSend);
b = toSend.getBytes('UTF8');
IN=char(b');
try
outputStream = httpConn.getOutputStream;
outputStream.write(b);
outputStream.close;
disp('Mensaje enviado')
catch e
exception = regexp(e.message, ...
'Java exception occurred: \n(.*?)\s*\n','tokens','once');
if ~isempty(exception)
exception = exception{1};
if strcmp(exception, ...
'java.net.ConnectException: Connection refused: connect')
error('MATLAB:callSoapService:ConnectionRefused','Connection refused.');
end
if strcmp(exception, ...
'ice.net.URLNotFoundException: Document not found on server')
error('MATLAB:callSoapService:UrlNotFoundOnServer','The requested URL was not found on this server.')
end
host = regexp(exception,'java.net.UnknownHostException: (.*)','tokens','once');
if ~isempty(host)
error('MATLAB:callSoapService:UnknownHost','Unknown host: %s',host{1})
end
error('MATLAB:callSoapService:Exception',exception)
else
rethrow(e)
end
end
try
disp('Recibiendo mensaje...');
inputStream = httpConn.getInputStream;
disp('Mensaje recibido!!')
byteArrayOutputStream = java.io.ByteArrayOutputStream;
isc = InterruptibleStreamCopier.getInterruptibleStreamCopier;
isc.copyStream(inputStream,byteArrayOutputStream);
inputStream.close;
byteArrayOutputStream.close;
OUT=byteArrayOutputStream;
message = e.message;
t = regexp(message,'java.io.IOException: (.*?)\n','tokens','once');
if ~isempty(t)
message = t{1};
end
%================================================================
function s = serializeDOM(x)
domSource = javax.xml.transform.dom.DOMSource(x);
tf = javax.xml.transform.TransformerFactory.newInstance;
serializer = tf.newTransformer;
serializer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING,'utf-8');
serializer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT,'yes');
stringWriter = java.io.StringWriter;
streamResult = javax.xml.transform.stream.StreamResult(stringWriter);
serializer.transform(domSource, streamResult);
s = char(stringWriter.toString);
lunes, 14 de enero de 2013
VT-x features locked or unavailable in MSR
Este mensaje tan bonito me salía una y otra vez cada vez que intentaba arrancar mi máquina virtual de ubuntu sobre Windows 7 que funcionaba perfectamente antes de que un repentino corte de luz me fastidiara todas mis máquinas virtuales. El caso es que no podía reinstalar mis apreciados back-ups. Seguía saliendo este error:
VT-x features locked or unavailable in MSR.
(VERR_VMX_MSR_LOCKED_OR_DISABLED)
The details are:
Result Code:
E_FAIL (0x80004005)
Component:
Console
Interface:
IConsole {1968b7d3-e3bf-4ceb-99e0-cb7c913317bb}
Pues bien, por lo visto al reiniciarse bruscamente el PC se modificaron las variables de la BIOS. Lo que hay que hacer (por lo menos a mí me ha servido) es:
VT-x features locked or unavailable in MSR.
(VERR_VMX_MSR_LOCKED_OR_DISABLED)
The details are:
Result Code:
E_FAIL (0x80004005)
Component:
Console
Interface:
IConsole {1968b7d3-e3bf-4ceb-99e0-cb7c913317bb}
Pues bien, por lo visto al reiniciarse bruscamente el PC se modificaron las variables de la BIOS. Lo que hay que hacer (por lo menos a mí me ha servido) es:
- Reinicias el PC y dándole a F10 o a supr, entras en la bios
- Buscas la variable VT y la habilitas (dependiendo de cada PC estará en un lugar o en otro). Ten paciencia y lee todos los recovecos de tu BIOS.
- Guardas los cambios
Y ya está, espero que le sirva a alguien más.
¡Hasta otra!
viernes, 9 de noviembre de 2012
Cambiar el proxy para Filezilla Client
Hola a todos,
Para cambiar el proxy en Filezilla Client hay que hacer lo siguiente:
Para cambiar el proxy en Filezilla Client hay que hacer lo siguiente:
- Edición > Opciones
- Conexión
- Proxy genérico -> lo deshabilitas marcando "Ninguno"
- FTP > Proxy FTP -> marcas la opción usuario@servidor y abajo introduces tu servidor proxy
Y como diría Elvisa Yomastercard, espero que os haya gustado... este tutorial.
Saludos!!
martes, 6 de noviembre de 2012
Cambiar el proxy en Windows XP
He estado un ratillo buscando por internet para cambiar el proxy de mi PC, y la única forma que ha resultado ha sido esta. Espero que le sirva a alguien más:
¡Saludos!
- Entras en tu PC con cuenta de administrador.
- Le das a Inicio > Panel de Control > Opciones de Internet
- Conexiones > Configuración de LAN
- Marcas la opción de "Usar un servidor proxy para LAN"
- Escribes la dirección de tu nuevo proxy y el puerto.
- Aceptas en las dos ventanas.
- ¡LISTO!
¡Saludos!
miércoles, 10 de octubre de 2012
IRAF: fitcoords y segmentation violation error
¡Buenas noches!
Estoy reduciendo espectros con IRAF y me he encontrado con un problema cuya solución no he encontrado en la web. Resulta que después de hacer identify y reidentify para enderezar el arco del espectro del neón, no era capaz de hacer fitcoords porque me lanzaba el siguiente error:
Longslit coordinate fit name is neon.
Longslit database is database.
Features from images:
neon
ERROR: segmentation violation
called as: `fitcoords (mode=h)'
Bicheando en internet no he encontrado solución, pero tras mucho luchar me he dado cuenta de que si las líneas del neón están saturadas, el fitcoords no funciona. Así que le he pasado un espectro sin saturar y funciona perfectamente.
Espero que os haya servido.
Saludos!
Estoy reduciendo espectros con IRAF y me he encontrado con un problema cuya solución no he encontrado en la web. Resulta que después de hacer identify y reidentify para enderezar el arco del espectro del neón, no era capaz de hacer fitcoords porque me lanzaba el siguiente error:
Longslit coordinate fit name is neon.
Longslit database is database.
Features from images:
neon
ERROR: segmentation violation
called as: `fitcoords (mode=h)'
Bicheando en internet no he encontrado solución, pero tras mucho luchar me he dado cuenta de que si las líneas del neón están saturadas, el fitcoords no funciona. Así que le he pasado un espectro sin saturar y funciona perfectamente.
Espero que os haya servido.
Saludos!
Suscribirse a:
Comentarios (Atom)