torek, 11. december 2012

Gotof je...

"Stari znanci in novi obrazi" bi lahko poimenoval igro "Gotof je", original  so leta 1978 razvili na Japonskem pod imenom "Space invaders"..
Cilj igre je zelo enostaven..
V vlogi "osvoboditelja" moramo "eliminirati" nasprotnike, ki nas ogrožajo. Ker je trenutno stanje v Sloveniji "rožnato - posejano s cvetlicami, ki nikoli ne zacvetijo" in ker je kapljico čez rob sprožil g.Kangler sem se pač odločil, da v ta namen priredim igro in jo preimenujem v "gotof je"..
V tej igri nastopajo nekateri "posebneži", ki v veliki meri grenijo, otežujejo, korumpirajo, zavajajo, nategujejo, zlorabljajo slovensko ljudstvo..





Sama igra je narejena za aparate - telefone s operacijskim sistemom Android. Dosegljiva je preko googlove trgovine "http://play.google.com" ali preko direknte povezave "GOTOF JE"..

Novica o igri je bila objavljena tudi na slovenskem radiju 1  , spletnem portalu zurnal24.si  , spletni strani Regional Obala ter lokalnem časopisu "Mandrač" za kar se jim seveda zahvaljujem...

Še nekaj zaslonskih posnetkov prirejene igre "Gotof je"...

četrtek, 29. november 2012

Oceanographic buoy Vida on mobile devices

Due to the broad interest of many users of Java ME applications for displaying the data of Oceanographic buoy Vida (OceanBuoyPiran) and tides (TideKP) and also in text format (WAP), which were released in 2007, I have recently prepared an application for mobile devices running Android.
 Application MBP can be obtained on the Android Market by searching the keywords "mbp" or "mbp vida" or directly on this link: https://play.google.com/store/apps/details?id=org.mbp&feature=search_result#?t=W251bGwsMSwyLDEsIm9yZy5tYnAiXQ
Special thanks also go to Mr. Mavricij Bizjak and the colleagues from Marine Biology Station Piran of the National Institute of Biology for the comments that have been welcomed in the development of the application.

četrtek, 8. november 2012

Android Custom UI: Horizontal Number Spinner

Hello everyone!
I would like to show how to design a custom UI element for Android the "Horizontal Number Spinner".

The final result looks like this:
Background images I have used:

Gray background
Glass background (9-patch)
Arrow

 1.) Create a custom component which extends View and implement GestureDetector.OnGestureListener interface

package si.in2.ui;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Scroller;

public class HorizontalNumberSpinner extends View implements
  GestureDetector.OnGestureListener {
 
 public static final int ARROW_BORDER = 10;
 public static final int BOTTOM_BORDER = 10;
 public static final int MARKER_DIFFERENCE = 8;
 public static final int TEXT_BORDER = 10;
 public static final int TEXT_HEIGHT = 10;
 public static final int TOP_BORDER = 10;
 private Bitmap arrowBitmap;
 
 private Paint arrowPaint;
 private Paint fontPaint;
 private Paint markerPaint;
 private Paint backgroundPaint;
 private Paint smallMarkerPaint;
 
 private GestureDetector gestureDetector;
 private OnChangeListener onChangeListener;
 private Scroller scroller;
 
 private Drawable backgroundBitmap;
 private int arrowOffset;
 private int bottomBorder;
 private int currentX;
 private int firstMarkerIndex;
 private String labelFormat;
 
 private int lastMarkerIndex;
 private int markerDifference;
 
 private int markerSpacing;
 private int maxScrollOffset;
 private double maxValue;
 private int minScrollOffset;
 private double minValue;
 
 private int scaleDivisions;
 private double scaleStep;
 private int scrollOffset;
 
 
 private double step;
 private int stepInPixels;
 private int textBorder;
 private int textHeight;
 private int topBorder;
 
 //interface for event handling
 public  interface OnChangeListener {
  public  void onValueChanged(String pString, double pDouble);
 }
 
 public HorizontalNumberSpinner(Context ctx) {
  super(ctx);
  init(ctx);
  
 }

 public HorizontalNumberSpinner(Context ctx,
   AttributeSet pAttributeSet) {
  super(ctx, pAttributeSet);
  init(ctx);
  
 }

 public HorizontalNumberSpinner(Context ctx,
   AttributeSet pAttrSet, int p) {
  super(ctx, pAttrSet, p);
  init(ctx);
  
 }

 
 private void getArrowOffset() {
  this.arrowOffset = (getMeasuredWidth() - this.arrowBitmap.getWidth() - (int) TypedValue
    .applyDimension(1, 10.0F, getResources().getDisplayMetrics()));
 }

 private int getMaxScrollOffset() {
  return (int) Math.ceil((this.maxValue - this.minValue)
    * this.scaleDivisions * this.markerSpacing / this.scaleStep);
 }

 private int getMinScrollOffset() {
  return (int) Math.ceil(this.minValue * this.scaleDivisions
    * this.markerSpacing / this.scaleStep);
 }

 /**
  * init 
  * @param ctx
  */
 private void init(Context ctx) {
  //
  scroller = new Scroller(ctx); //This class encapsulates scrolling
  gestureDetector = new GestureDetector(this);  //Detects various gestures and events using the supplied MotionEvents
  
  topBorder =  (int)TypedValue.applyDimension(1, 10, getResources().getDisplayMetrics());
  bottomBorder = (int) TypedValue.applyDimension(1, 10, getResources().getDisplayMetrics());
  markerDifference = (int) TypedValue.applyDimension(1, 8,getResources().getDisplayMetrics());
  textHeight = (int) TypedValue.applyDimension(1, 10, getResources().getDisplayMetrics());
  textBorder = (int) TypedValue.applyDimension(1, 10, getResources().getDisplayMetrics());
  
  //default values
  minValue = -200000;
  maxValue = 1000000;
  scaleStep = 1000;
  step = 100;
  scaleDivisions = 5; 
  arrowOffset = 200;
  markerSpacing = 16; 
  labelFormat = "%10.3f";
  stepInPixels = (int) ((step *  scaleDivisions *  markerSpacing) / scaleStep);
  maxScrollOffset = getMaxScrollOffset();
  minScrollOffset = getMinScrollOffset();
  
  //Log.i("SPINER", "maxScrollOffset: " + maxScrollOffset);
  //Log.i("SPINER", "minScrollOffset: " + minScrollOffset);
  
  //Here we set the background image
  this.backgroundBitmap = getResources().getDrawable(R.drawable.sp_bg_3);
  
  //copy the arrow bitmap into variable arrowBitmap 
  this.arrowBitmap = BitmapFactory.decodeResource(
    getContext().getResources(), R.drawable.spinner_pointer).copy(
    Bitmap.Config.ARGB_8888, true);
  
  
  //get the arrow offset.
  getArrowOffset();
  
  //Setup paint objects for 
  initPaintObjects();

 }

 private void initPaintObjects() 
 {
  markerPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  markerPaint.setColor(Color.WHITE);
  markerPaint.setStrokeWidth(3);
  markerPaint.setStyle(Paint.Style.FILL);
  
  smallMarkerPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  smallMarkerPaint.setColor(Color.WHITE);
  smallMarkerPaint.setStrokeWidth(1.0F);
  smallMarkerPaint.setStyle(Paint.Style.FILL);
  smallMarkerPaint.setTextAlign(Paint.Align.CENTER);
  smallMarkerPaint.setTextSize(10);
  
  fontPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  fontPaint.setStyle(Paint.Style.STROKE);
  fontPaint.setColor(Color.WHITE);
  fontPaint.setStrokeWidth(1);
  fontPaint.setAntiAlias(true);
  fontPaint.setTextSize(12);
  fontPaint.setTextAlign(Paint.Align.CENTER);  
  
  backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

  arrowPaint = new Paint();
  
  }

 
 private int measureHeigth(int height) {
  View.MeasureSpec.getMode(height);
  return View.MeasureSpec.getSize(height);
 }

 private int measureWidth(int width) {
  View.MeasureSpec.getMode(width);
  return View.MeasureSpec.getSize(width);
 }

 private void notifyListener() {

  if (this.onChangeListener != null) {
   double d = getValue();
      //fire event 
   onChangeListener.onValueChanged(String.format(this.getFormat(), d), d);
  }
 }

 private void scrollToSelectableValue() { 
  
  int val = Math.round(this.scrollOffset / this.stepInPixels) * this.stepInPixels;
  scroller.startScroll(scrollOffset, 0, val - this.scrollOffset, 0);
  Log.i("SPINER", "scrollToSelectableValue val="+ val +"," + scrollOffset);
  post(new Runnable() {
   public void run() {
    if (!scroller.isFinished()) {
     postDelayed(this, 20);
     invalidate(); //correct the value on the spinner     
     return; 
    }
   }
  });
 }

 

 @Override
 public boolean onDown(MotionEvent paramMotionEvent) {
  Log.i("SPINER", "onDown: ");
  
  scroller.abortAnimation();
  scrollToSelectableValue();
  
  return true;
 }

 @Override
 public void onDraw(Canvas pCanvas) {
  
  //check if the scroller is not finished
  if (scroller.isFinished() == false) 
  {
   scroller.computeScrollOffset();
   scrollOffset = scroller.getCurrX(); //get the scroller currnet x value
   notifyListener(); 
  }

  this.backgroundBitmap.setBounds(0, 0, getMeasuredWidth(),getMeasuredHeight());
  this.backgroundBitmap.draw(pCanvas);
  
  //calcukate curentx, first and last marker index...
  this.firstMarkerIndex = ((-this.scrollOffset - this.arrowOffset) / this.markerSpacing);
  this.firstMarkerIndex -= (this.scaleDivisions - this.firstMarkerIndex) % this.scaleDivisions;
  this.currentX = (this.arrowOffset + this.markerSpacing * this.firstMarkerIndex + this.scrollOffset);
  this.lastMarkerIndex = ((-this.scrollOffset - this.arrowOffset + getMeasuredWidth()) / this.markerSpacing);
  this.lastMarkerIndex += this.scaleDivisions - this.lastMarkerIndex % this.scaleDivisions;

  int chk = firstMarkerIndex;
  while(true) {
   if (chk > lastMarkerIndex) {
    pCanvas.drawBitmap(arrowBitmap,
      arrowOffset - (arrowBitmap.getWidth() / 2), 0.0F,
      backgroundPaint);
    return;
   }

   if (chk % scaleDivisions == 0) {
    double d =  (chk / scaleDivisions) * scaleStep;
    
    //draw the leading line
    pCanvas.drawLine(currentX, topBorder, currentX,
      getMeasuredHeight() - bottomBorder - textHeight
        - textBorder, markerPaint);
   
     //draw text below the leading line
    pCanvas.drawText(String.format(labelFormat, d), currentX, getMeasuredHeight() - bottomBorder, fontPaint);
    
     currentX +=  markerSpacing;
    
   } else {
    //lines between leading lines
    pCanvas.drawLine(currentX, topBorder, currentX,
      getMeasuredHeight() - bottomBorder - textHeight
        - textBorder - markerDifference,
      smallMarkerPaint);
    currentX +=  markerSpacing;
   }
   
   chk++;
  } 

 }

 @Override
 public boolean onFling(MotionEvent pMotionEvent1,
   MotionEvent pMotionEvent2, float x, float y) {
  Log.i("SPINER", "onFling: " + x + ", " + y );
  scroller.fling(this.scrollOffset, 0, (int) x,
    (int) y, -this.maxScrollOffset,
    -this.minScrollOffset, 0, 0);
  //start a thread and after 20msec verify if scroller is finished then repaint object..
  post(new Runnable() {
   public void run() {
    if (!scroller.isFinished()) {
     invalidate();
     postDelayed(this, 20);
    } else {
     scrollToSelectableValue();

    }
   }
  });
  return false;
 }

 
 protected void onMeasure(int w, int h) {
  Log.i("SPINER", "onMeasure: " + w + ", " + h );
  int i = measureHeigth(w);
  int j = measureWidth(h);
  getArrowOffset();
  setMeasuredDimension(j, i);
 }

 public boolean onScroll(MotionEvent paramMotionEvent1,
   MotionEvent paramMotionEvent2, float x, float y) {
  Log.i("SPINER", "onScroll: " + x + ", " + y );
  this.scrollOffset = (int) (this.scrollOffset - x);

  if (this.scrollOffset < -this.maxScrollOffset) {
   this.scrollOffset = -this.maxScrollOffset;
  }
  invalidate();
  notifyListener();
  return true;

 }

 @Override
 public void onShowPress(MotionEvent pMotionEvent) {
  return;
 }

 @Override
 public boolean onSingleTapUp(MotionEvent pMotionEvent) {
  return false;
 }

 @Override
 public boolean onTouchEvent(MotionEvent pMotionEvent) {
  if ((pMotionEvent.getAction() == MotionEvent.ACTION_UP) && (this.scroller.isFinished()))
   scrollToSelectableValue();
  this.gestureDetector.onTouchEvent(pMotionEvent);
  return true;
 }

 public void setBackgroundBitmap(Drawable pDrawable) {
  this.backgroundBitmap = pDrawable;
 }

 public void setFormat(String format) {
  this.labelFormat = format;
 }

 public void setMaxValue(double mValue) {
  this.maxValue = mValue;
  this.maxScrollOffset = getMaxScrollOffset();
 }

 public void setMinValue(double minValue) {
  this.minValue = minValue;
  this.minScrollOffset = getMinScrollOffset();
  this.maxScrollOffset = getMaxScrollOffset();
 }

 public void setOnChangeListener(OnChangeListener pOnChangeListener) {
  this.onChangeListener = pOnChangeListener;
 }

 public void setScaleDivisions(int i) {
  scaleDivisions = i;
  minScrollOffset = getMinScrollOffset();
  maxScrollOffset = getMaxScrollOffset();
 }

 public void setScaleStep(double d) {
  scaleStep = d;
  step = d /  (2 * scaleDivisions);
  stepInPixels = (int) ((step * scaleDivisions *  markerSpacing) / d);
  minScrollOffset = getMinScrollOffset();
  maxScrollOffset = getMaxScrollOffset();
 }

 public void setValue(double d) {
  scrollOffset = (int) ((-d *  (scaleDivisions * markerSpacing)) / scaleStep);
  invalidate();
  scrollToSelectableValue();
 }
 
 public String getFormat() {
  return this.labelFormat;
 }

 public double getMaxValue() {
  return this.maxValue;
 }

 public double getMinValue() {
  return this.minValue;
 }

 public int getScaleDivisions() {
  return this.scaleDivisions;
 }

 public double getScaleStep() {
  return this.scaleStep;
 }

 public double getStep() {
  return this.step;
 }

 public double getValue() {
  return ( (-scrollOffset) * scaleStep)
    /  (scaleDivisions * markerSpacing);
 }

 @Override
 public void onLongPress(MotionEvent arg0) {
  // TODO Auto-generated method stub
 return;
  
 }
}

2.Android Layout file




    
    
    

    
    



3. HorizontalSpinnerActivity file
In the "main" activity we initialize our HorizontalSpinner with some values:

package si.in2.ui;

import android.app.Activity;
import android.os.Bundle;

import android.widget.LinearLayout;
import android.widget.TextView;

public class HorizontalSpinnerActivity extends Activity  {
    /** Called when the activity is first created. */
 
 HorizontalNumberSpinner spinner;
 LinearLayout layout;
 TextView text;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        text = (TextView)  findViewById(R.id.textView1);
       
        spinner = (HorizontalNumberSpinner)findViewById(R.id.spiner);
        spinner.setMaxValue(10000.0); // set the maximum value
        spinner.setMinValue(-10000.0);// set the minimum value
        spinner.setScaleStep(50.0); // step for 50 values
        spinner.setScaleDivisions(5); // set scale division between numbers
        spinner.setFormat("%.000f"); // set the format displayed below leading line
        spinner.setValue(5000.0); // start at value
        
        //event handling
        spinner.setOnChangeListener(new HorizontalNumberSpinner.OnChangeListener()
        {
          public void onValueChanged(String paramString, double paramDouble)
          {
            text.setText("Value: " + paramDouble);
          }
        });
        
      
    }

 
}


ponedeljek, 9. april 2012

Reading applet parameters in Oracle Forms

Reading oracle forms forum I have found out this question:

"Dears
We are working with system with 2 application server IPs and one Real IP (which is able to be accessed through internet)
I would like to know the URL is the user using in order to use his IP to open something else from the system.
Chcking the host name not usesful because if user connect from home using Real IP it return the AS host name which real IP redirct to it.
I need to know how to get the URL of the session from the form or to know whether the user connected using the Real IP or not.
(Oracle forms 10gR2)
"

The simple solution is to write down a java bean component (pjc) for Oracle Forms.
As you know the PJC must extends VBean object and also pass a IHandler instance to it.
From IHandler you can read Applet parameters like Applet.getDocumentBase. The getDocumentBase() method of Applet class returns the URL of the document in which this applet is embedded.

Below is the PJC which can read some user specific datas.
CLIENT_IP return the client ip number,
CLIENT_NAME return the name of local (client) computer
CLIENT_OS return the opetating system name
CLIENT_USER return the user name which is logged to the system
HOST_URL return the URL of the document in which the Oracle Forms application is embedded (run).

package in2.client;
 
import java.io.PrintStream;
import java.net.InetAddress;
import oracle.forms.handler.IHandler;
import oracle.forms.properties.ID;
import oracle.forms.ui.VBean;
 
public class ClientInfo extends VBean
{
  private static final ID CLIENT_IP = ID.registerProperty("CLIENT_IP");
  private static final ID CLIENT_NAME = ID.registerProperty("CLIENT_NAME");
  private static final ID CLIENT_OS = ID.registerProperty("CLIENT_OS");
  private static final ID CLIENT_USER = ID.registerProperty("CLIENT_USER");
  private static final ID HOST_URL = ID.registerProperty("HOST_URL");
  
  private IHandler mHandler;
  private String hostAddress = "";
  private String hostName = "";
  private String hostOs = "";
  private String hostUser = "";
  private String hostURL = "";
 
  public ClientInfo()
  {
    try
    {
      
      System.out.println("+----------------------+");
      System.out.println("+  ClientInfro PJC     +");
      System.out.println("+  Peter Valencic      +");
      System.out.println("+----------------------+\n"); 
 
      this.hostAddress = InetAddress.getLocalHost().getHostAddress();
      this.hostName    = InetAddress.getLocalHost().getHostName();
      this.hostOs      = System.getProperty("os.name");
      this.hostUser    = System.getProperty("user.name");
 
      System.out.println("Host   adress: " + this.hostAddress);
      System.out.println("Host     name: " + this.hostAddress);
      System.out.println("Host op. syst: " + this.hostOs);
      System.out.println("Host username: " + this.hostUser);
      System.out.println("+----------------------+\n");
    }
    catch (Exception e)
    {
      System.out.println("Init error: " + e.toString());
    }
  }
 
  public void init(IHandler handler)
  {
    super.init(handler);
    this.mHandler = handler;
    
  }
 
  public Object getProperty(ID pid)
  {
    if (pid == CLIENT_IP) {
      System.out.println("Client IP: " + this.hostAddress);
 
      return "" + this.hostAddress;
    }
 
    if (pid == CLIENT_NAME) {
      System.out.println("Client Name: " + this.hostName);
 
      return "" + this.hostName;
    }
 
    if (pid == CLIENT_OS) {
      System.out.println("Client os: " + this.hostOs);
 
      return "" + this.hostOs;
    }
 
    if (pid == CLIENT_USER) {
      System.out.println("Clientuser: " + this.hostUser);
 
      return "" + this.hostUser;
    }
    
    if (pid == HOST_URL) {
      hostURL = this.mHandler.getApplet().getDocumentBase();
      System.out.println("Host Url: " + this.hostURL);
      return "" + this.hostURL;
    }
 
    return super.getProperty(pid);
  }
}





torek, 6. marec 2012

Replacing impeller on yamaha F80 outborad engine

Impeller is a critical part in marine engines. It is the main component of the water pump and is used to pump fresh and cold water to the engine cooling system. That is why it is so important to check its condition very often. If your impeller is broken you may permanently damage your engine because of overheating your boat engine. There is an unwritten rule that says that you should replace your impeller on your boat engine every two years even if it's in good condition.


  1. First we unscrew the four screws that are visible on the side of the engines heel.
  2. Next we have to remove the rubber plugin on the narrow end of the engine and we unscrew the zinc protector that is located above the propeler
  3. We remove the zinc protector and we unscrew the number 12 bolt from the bottom side
  4. Next we have to remove the engine heel and remove it from the boat engine
  5. We have to buy original Yamaha impeller
  6. Next we remove the four bolts from the water pump housing
  7. We use a hammer to gently tap on the water pump housing to remove it (Warning: Handle with care!!)
  8. What we see in front of us is a boat engine shaft with a small rubber propeler attached to it => that is impeller
  9. We take the impeller of the shaft (if it won't go of we use a knife on it)
  10. We put our newly bought original impeller on the shaft and put a small metal plugin inside a little hole in the shaft to hold the impeller in place
  11. We put the water pump housing back in place and we have to wrap the impeller blades to fit inside the water pump housing
  12. The blades must be slightly bent inside the water pump housing
  13. We than screw everything back in its place, and before you put your screws in you might consider lubricating them with a water resistant lubricant
You can see/read a complete tutorial in my previous blog (slovene version)  following this link: http://peterv6i.blogspot.com/2012/01/zamenjava-impelerja-na-motorju-yamaha.html 

petek, 3. februar 2012

PL/SQL in JAVA - vračanje sistemskih parametrov

Pri nekem projektu sem naletel na potrebo po zaznavi operacijskega sistema na katerem teče podatkovna baza Oracle. Pravtako sem potreboval verzijo java prevajalnika saj sem moral uporabiti knjižnice, ki so bile prevedene s točno določenim prevajalnikom (1.5).

Pri tem primeru sem si pomagal s pl/sql funkcijo, ki pokliče statično metodo razreda java.lang.System getPropery.
Z naborom parametrov lahko tako v pl/sql-u pridobimo sledeče vrednosti (glej tabelo)

java.version Java Runtime Environment version
java.vendor Java Runtime Environment vendor
java.vendor.url Java vendor URL
java.home Java installation directory
java.vm.specification.version Java Virtual Machine specification version
java.vm.specification.vendor Java Virtual Machine specification vendor
java.vm.specification.name Java Virtual Machine specification name
java.vm.version Java Virtual Machine implementation version
java.vm.vendor Java Virtual Machine implementation vendor
java.vm.name Java Virtual Machine implementation name
java.specification.version Java Runtime Environment specification version
java.specification.vendor Java Runtime Environment specification vendor
java.specification.name Java Runtime Environment specification name
java.class.version Java class format version number
java.class.path Java class path
java.library.path List of paths to search when loading libraries
java.io.tmpdir Default temp file path
java.compiler Name of JIT compiler to use
java.ext.dirs Path of extension directory or directories
os.name Operating system name
os.arch Operating system architecture
os.version Operating system version
file.separator File separator ("/" on UNIX)
path.separator Path separator (":" on UNIX)
line.separator Line separator ("\n" on UNIX)
user.name User's account name
user.home User's home directory
user.dir User's current working directory










Funckija:
create or replace function f_vrni_parameter(p_vhodni in varchar2) return varchar2 as language java name  'java.lang.System.getProperty(java.lang.String) return java.lang.String';


Klic v pl/sql-u pa


select f_vrni_parameter('java.version') from dual
select f_vrni_parameter('os.version) from dual 
 

Nekaj podobnih vrednosti lahko dobimo tudi v paketu DBMS_UTILITY vendar ta ni podprt pri starejših bazah podatkov

torek, 31. januar 2012

Regulator napetosti yamaha f80 in ekvivalent

Zgodba se začne ko sem nekega jutra odšel na morje... No.. prišel sem le do pomola in čolna. Ko sem hotel vžgati motor je ta samo "kihnil".. Takoj sem videl, da je akumulator prazen..
Malce sem bil začuden in presenečen saj sem bil pred kratkim na morju in nisem imel nobenih težav.
Ta dan si bom zapomnil po bolečini..
Povzročil mi jo je ravno motor..
Ker je bil akumulator prazen sem odvijačil tri vijake na pokrovu pod katerim se skriva vztrajnik in okrog vztrajnika ovil vrv.. Prijel sem bolj "švoh" in potegnil..
Kontra udarec mi je posledično privzdignil noht na roki (palec) tako, da to je bil dober začetek dneva..
Drugi poteg je bil bolj "muški" in pri tem potegu je motor vžgal.. Vžig osemdeset konjskega motorja lahko primerjamo z vžigom avtomobila tako, da okrog kolesa ovijemo vrv in pač vžgemo avto ;)

Med vožnjo sem spremljal števec kjer so poleg milj in goriva prikazana še napetost akumulatorja. Opazil sem, da je napetost pod 13V kar pomeni, da ne deluje sistem za polnjenje akumulatorja (regulator napetosti).
Čez nekaj dni sem čoln spravil na prikolico in pripeljal domov.
Odstranil sem pokrov motorja in odvijačil vijake nad vztrajnikom ter na sprednji strani motorja pod katerim se nahaja regulator (pravokotna aluminijasta škatlica s hladilnimi rebri).


Izstaknil sem okrogel konektor ter z inštrumentom preveril upornost statorja. Iz statorja prihajajo tri žice po katerih se pretaka "izmenična" napetost.

Konektor sem nato priklopil nazaj  na regulator ter vžgal motor. Na izhodnih žicah regulatorja (dve žici + in -) sem izmeril izhodno napetost (enosmerno) katera ni presegala 1.5 - 1.7 V.

 Regulator sem nato odstranil iz bloka motorja ter na internetu poiskal omenjeni kos v kosovnici za izvenkrmne motorje yamaha. S šifro regulatorja sem odšel do treh različnih pooblaščenih serviserjev in za omenjeni kos so želeli med 230 in 270 EUR!

Potem sem se odločil, da bom na internetu poiskal kakšen ekvivalent trifaznega regulatorja in našel trifazni regulator za cestni motor Suzuki Intruder za vsega okrog 90-95 EUR..

Iz starega regulatorja sem odstranil žice ter jih zacinil na novi regulator

Sledila je še montaža in zagon motorja.
Regulator je ob maximalnih obratih na izhodu regulatorja obdržal napetost 14.8 Volta, pri obratih 1000 - 5000 (rpm ) je izhodna napetost bila v mejah med 13.8 in 14.5 Volta.

S tem posegom sem prišparal okrog 170-180 EUR samo za regulator napetosti.






četrtek, 26. januar 2012

Osnovni servis 4 taktnega motorja Yamaha F80

Odločil sem se, da napišem postopek, ki ga opravljam sam kot "amater" pri servisiranju motorja Yamaha F80.
Glede na to, da je motor sestavljen iz "kosov" ni razloga, da se nebi človek sam lotil osnovnih servisnih posegov ki vsebujejo (menjavo olja motorja, menjavo filtra olja, menjava cink protektorjev ali anod, menjava svečk, menjava impelerja etc...). V pomoč nam je lahko tudi "kosovnica", ki se nahaja na straneh proizvajalca motorjev (Yamaha).

Za servisiranje Yamahe sem se odločil zaradi tega, ker se mi zdi cena na servisih pretirano visoka. Za osnovni servis motorja na obali vzamejo od 200-350 EUR.

Veliko ljudi se odloča za servise pri pooblaščenih serviserjih ker menijo da je tako pač najboljše in ker dobijo žig v servisno knjigo.. Ker uporabljam čoln izključno jaz oziroma 100% ga vozim samo jaz poznam vsako cako na svojem čolnu in tudi bolj sem siguren če vem kaj sem opravil - popravil. Res pa je, da se ljudje ne odločajo za samostojen poseg v kolikor je motor še v garanciji.

Kako se lotit servisa?
Prva stvar je zaupanje v samega sebe :)
Druga stvar je malo tehničnih izkušenj (kam se vijak odvija in kam zavija)
Tretja stvar je pregled kosovnice
Četrta stvar je nabava original delov ali delov od konkurence (sicer eno in isto le cena je pri prvih 4x večja).
Orodje se sestoji iz križnega izvijača, ploščateg izvijača, ključa 14 in 13, ključ za filter (prodajajo na vsaki bencinski), mast, posoda za odpadno olje, krpa za brisanje oljnih madežev in olja..

Za začetek si oglejmo motor:

Kaj potrebujemo za osnovni servis:


- ključ 13 in 14
- izvijač križni in ploščati
- ključ za filter olja
- komplet 4 svečk ki so specificirane na posameznem motorju (LFR6A NGK)
- filter olja
- 3x cinkove anode (blok motorja)
- mast za vijake
- olje za motor
- olje za v peto motorja - menjalnik


Izpust starega olja iz motorja:
- Vijak za izpust olja se nahaja v gumijastem tulcu, ki služi kot neke vrste "lij" kadar menjujemo olje..
- Pripravimo si "gedore" na podaljšku številka 14 in primerno posodo za cca 5 litrov starega olja. Jaz sem uporabil kar plastično kantico..
- Odvijemo vijak in ga povlečemo iz odprtine..
- Zaradi "usipa" olja nastavimo kantico pod tulec v katerega se bo izteklo staro olje.
- Na "gedori" nam ostane vijak in "bakrena podložka"...
- Olja mora biti cca 4.5 - 4.8 litra.

Kantica s starim oljem...



Staro olje odnesite v zbiralnik na bencinsko črpalko

Na desni strani motorja se nahaja:
- Filter olja,
- Cink anoda
- 2x tuljave za vžig

Odvijačiti moramo filter olja.. To naredimo s posebnim ključem za filtre, ki ga dobimo v vsaki trgovini... nekateri ključi so taki kot je moj (jermen) nekateri pa imajo verigo..
Ker se filter olja s časom "zapeče" je potrebno malo več moči pri odvijanju filtra.. Pri temu moramo paziti da nam jermen ne zdrsne saj lahko poškodujemo senzor temperature ki je tik ob filtru olja na bloku motorja..
Ker je potrebno malo več moči pri odvijanju se lahko filter deformira.. kar pa ni nič narobe ker ga bomo itak zamenjali z novim..

Montaža filtra in nalivanje olja
- namestiti moramo nov filter
- tesnilo filtra namažemo z oljem in ročno privijačimo na motor. Pazimo da ga ne zatisnemo preveč saj ga kasneje bomo težko odvili!!!
- preverimo da smo privili vijak za izpust olja na motorju! (če vijak vsebuje bakreno podložko jo zamenjamo z novo saj se baker ob privitju deformira in služi kot tesnilo)



Filter privijemo na mesto kjer je bil star



- Odvijemo čep na motorju in nalijemo sveže olje ;)



Olja nalijemo 4.5 litra (kot je navedeno na motorju)
Nivo olja preverimo s šibko kot pri avtu. Nahaja se desno ob bloku motorja če gledamo motor iz zadnje smeri proti premcu čolna. S tem smo zaključili postopek menjave olja v motorju.

Menjava svečk na motorju




-Svečke na motorju se nahajajo pod plastičnim pokrovom, ki sem ga na zgornji sliki že odstranil
-Odvisno od števila cilindrov je tudi število svečk
-Vsaka svečka je povezana s kablom, ki gre na vžigalno tuljavo katera proizvaja visoko napetost, ki je potrebna da preskoči iskra med elektrodo svečke.
-Kabel na svečkah je označen z 1,2,3,4 saj ne smemo zamešati vrstnega reda ker nam motor ne bo več pravilno deloval. (vprašanje če bi sploh vžgal. V mojem primeru so kabli označeni z številkami).

-Ko odstranimo zaščitni pokrov izvlečemo kabel iz vsake svečke posebej
-Za odvijačenje svečke uporabimo cevni ključ, ki je priložen motorju ali pa ga kupimo na bencinski črpalki
-Svečke nato odvijemo iz cilindrov motorja in jih zamenjamo z novimi
-Ko so svečke privijačene nataknemo kabel na svečko in se prepričamo da je vse kot mora biti  (vrstni red kablov).

Primer nove in stare svečke



Menjava cinkovih anod
Kot sem že zgoraj napisal so v glavi motorja 3 cinkove anode katere je potrebno redno menjati.. Cinkove anode služijo zaradi tega, ker se v motorju zaradi slane vode in različnih kovin pojavi galvanski tok.. Cinkove anode se zato žrtvujejo in s tem preprečijo, da bi galvanski tok "pojedel - pobral" stene motorja... V glavi motorja je to še posebej občutljiva zadeva, saj se za tankimi stenami nahajajo bati. Predstavljamo si lahko kaj bi pomenilo, ko nam bi galvanski tok "pregrizel" steno ;)

Anode odvijemo s ključem 12 (dva vijaka).. izvlečemo kos iz motorja ter s ključem odvijemo anodo iz nosilca.. Anodo zamenjamo z novo in zadevo montiramo tako kot je bila pred tem..

Stara in nova anoda:




Zamenjane vse tri anode



Kontrola črpalke goriva
Odvijačimo tri vijake in pridemo do črpalke benzina.
Črpalko očistimo s komprimiranim zrakom, da odstranimo morebitne smeti.
Bodite pozorni na membrano označeno z rdečo barvo. Membrana ne sme biti poškodovana oziroma ne sme kazati znake poškodbe (preperela guma).




Filter goriva
Se nahaja na levi strani motorja. Filter odvijemo in zamenjamo ali očistimo.
Pozorni moramo biti na O-ring filtra, da ga ne poškodujemo. Preden pritrdimo filter na motor moramo oring namazati z oljem ali mastjo.




Drenaža vode iz črpalke goriva
Na bloku motorja se nahaja vijak s katerim izpustimo "vodo", ki se je nabrala v črpalki goriva. Bodite pozorni, da vijaka ne odvijete do konca, saj boste imeli problem za ga postavit nazaj na mesto! (težko dostopno)





Senzor temperature vode v bloku motorja
Senzor je termoupor, ki nadzira temperaturo vode v bloku motorja.
V kolikor se temperatura poveča (slabo hlajenje) se vklopi alarm.
V primeru, da se senzor pokvari lahko na lastno odgovornost senzor premostičimo z uporom vrednosti 2.5 Kohm.. (ampak to le če se zavedamo, da je senzor na motorju v okvari.)



Senzor pritiska olja v motorju
V primeru okvare senzorja za pritisk olja v motorju lahko kabel spojimo z maso (ohišjem) motorja in tako mostičimo signal (NC normaly closed).
Senzor se aktivira če pristik naraste nad 1.5 bara in je v statusu NO  (normaly opened).




Termostat vode
Na zgornjem delu pri zobatem jermenu se nahaja termostat.
Dobro ga je redno pregledati in v primeru da se na njemu nahaji vodni kamen - apnenec ga potopimo v (viakal ali wcnet) in s ščetko odstranimo kamen.
Delovanje termostata preverimo tako, da termostat potopimo v vodo 50°C-60°C. Ventil se pri tej temperaturi "odpre".
Prostor kjer je fiksiran termostat očistimo in podmažemo z mastjo, da ga lažje montiramo v ohišje.



očistimo apnenec



očiščen termostat



Kontrola zobati jermen
Dobro je preveriti zobati jermen.Jermen povezuje glavno gred z dvema odmičnima. V primeru da se jermen poškoduje nam lahko uniči motor (povije ventile).
Jermen preverimo na ogled (ne sme kazati razpok in ne sme biti mlahav.
Praviloma bi morali jermen menjati vsakih 5 let ali 500 delovnih ur.
Zobati jermen se ne sme upogniti za več kot 10mm!!
Pri pregledu motorja lahko preverimo "fazo" motorja.. Na odmičnih gredeh (zobnikih) se nahaja "puščica". Ko motor zavrtimo na roke se morata puščici na odmičnih gredeh "poklopiti"





Glavno gred ročno obrnemo na oznako TDC (top death center) zgornja mrtva točka..


faza na odmičnih gredeh se mora ujemati!



Podmazovanje motorja
Motor je potrebno podmazovati na mestih, ki so predvidena za "mazalko - mazalico". Uporabljamo vodoodporno mast in ne "litijevih, ki v stiku z vodo strdnejo".



Kontrola semering-a na osovini - propelerja
Dobro je preverit, ali je semering na osovini motorja, kjer pride fiksiran propeler nepoškodovan. V nasprotnem primeru bomo imeli v menjalniku vodo + olje!


Menjava olja v peti motorja
Za menjavo olja v peti potrebujemo posodo za staro olje, izvijač (ploščati), nove podložke, olje za menjalnike ter pumpico za olje s katero bomo olje "nalili" v peto motorja.
Olje vbrizgujemo od spodaj navzgor (verjetno) zaradi tega ker s tem izpodrivamo zrak, ki je v notranjosti pete.. Če bi nalivali olje iz vrha navzdol bi v motorju po vsej verjetnosti ostali baloni zraka ki zaradi gostote samega olja težko prehajajo na površje..

Na peti motorja odvijemo spodnji vijak



Ko vijak odvijemo priteče olje....
- pri olju bodite pozorni.. Če je olje "belo" pomeni da je nastala emulzija in da v peto motorja nekje pronica voda.. morda so šli semeringi pri osovini motorja!



Ko se olje izteče pripravimo novo olje in ga nalijemo v "pantigano"..
V luknjico na spodnji strani pete vstavimo cevko in pričnemo pumpati olje v motor.. Ko se pumpica isprazni hitro nastavimo vijak ali prst na spodnjo luknjo na peti da nam olje nebi ušlo (ker je olje "gosto" ni strahu da se nam bi razlilo).
Pripravimo novo "pošiljko" olja in spet pumpamo....



Ko je olja dovolj se ta pojavi na zgornji luknji pete.
Takrat zatisnemo spodnji vijak in nato še zgornjega.. ali pa obratno..


S tem postopkom smo končali osnovni servis izvenkrmnega motorja, ki so ponavadi opravi pred sezono. Preventivno preverimo še komande (zajle). V primeru trdega volana lahko zamenjamo tudi "pletenico" (ultraflex), ki povezuje volan in mehanizem za obračanje motorja.

Pa veliko sreče pri servisiranju..

vir:
-večina slik je mojih
-nekaj sem jih pobral iz formua gommonauti.it



sreda, 25. januar 2012

Zamenjava impelerja na motorju Yamaha F80

Impeler ali vodna pumpa je nepogrešljiv element v motorju saj se preko njega / nje dovaja voda v glavo motorja, ki služi za hlajenje motorja. Po pravilih (preventiva) naj bi impeler menjali vsake dve leti.. No jaz se tega nisem držal in sem tako zadnjič ostal sredi morja..

1. Najprej odvijemo 4 vijake, ki so vidni ob straneh motorja.
Nato odstranimo gumijasti čep na ožjem delu in odvijemo cink protektor nad propelerjem..
Snamemo cink protektor in s ključem 12 odvijemo vijak iz spodnje strani...
Primemo peto motorja in jo snamemo iz ohišja motorja..

Impeler kupimo original

Odijevo 4 vijake iz ohišja vodne pumpe...

S kladivom na rahlo potolčemo po ohišju in ga snamemo....



Tako pridemo do impelerja... ;)



Impeler snamemo iz osovine..če ne gre ga kar izrežemo z olfa nožem...




Na osovino nataknemo nov impeler.. Pozorni moramo biti, ker ima impeler kjer pride osovina utor. Impeler je potrebno namestiti na ležišče osovine tako, da gre utor na "zatič", ki štrli iz osovine..




Nato namestimo ohišje vodne pumpe in z roko potisnemo krilca impelerja tako, da ležejo v ohišje. Lopatice - krilca impelerja so v ohišju ukrivljene..
Vseskupaj privijačimo in peto ponovno namestimo v ohišje motorja..
Vstavimo vijake in jih zatisnemo... (preden zatiskamo vijake jih je dobro podmazati z vodoodporno mastjo)..

Porabljen čas cca. 35 minut..